(五)案例
1.集合到文件
代码实现:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class ArrayToFile {
public static void main(String[] args) throws IOException {
//创建集合对象
ArrayList<String> array = new ArrayList<>();
//存储字符串元素
array.add("hello");
array.add("java");
//创建字符缓冲输出流对象
BufferedWriter br = new BufferedWriter(new FileWriter("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\test.txt"));
//遍历集合,得到每一个字符串数据
for(String s : array){
//调用字符缓冲输出流对象的方法写数据
br.write(s);
br.newLine();
br.flush();
}
//释放资源
br.close();
}
}
2.文件到集合
代码实现:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class FileToArrayList {
public static void main(String[] args) throws IOException {
//创建字符缓冲输入对象
BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\test.txt"));
//创建ArrayList集合对象
ArrayList<String> array = new ArrayList<>();
//调用字符缓冲输入对象读取数据
String line;
while ((line = br.readLine()) != null) {
array.add(line);
}
//释放资源
br.close();
//遍历集合
for (String s : array) {
System.out.println(s);
}
}
}
3.点名器
需求:有一个文件里面存储了班级同学的姓名,每个姓名占一行,要求通过程序实现随机点名器
代码实现:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class FileToArrayList {
public static void main(String[] args) throws IOException {
//创建字符缓冲输入对象
BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\test.txt"));
//创建ArrayList集合对象
ArrayList<String> array = new ArrayList<>();
//调用字符缓冲输入对象读取数据
String line;
while ((line = br.readLine()) != null) {
array.add(line);
}
//释放资源
br.close();
//遍历集合
for (String s : array) {
System.out.println(s);
}
}
}
4.集合到文件(升级版)
把ArrayLIst中的学生数据写入到文本文件中。要求:每一个学生对象的数据作为文件中的一行数据
代码实现:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
public class ArrayToFileProDemo {
public static void main(String[] args) throws IOException {
//创建缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\Student.txt"));
//创建ArrayList集合对象
ArrayList<Student> array = new ArrayList<>();
//创建学生对象
Student s1 = new Student(19103201,"学生1",20,"天津");
Student s2 = new Student(19103202,"学生2",21,"北京");
Student s3 = new Student(19103203,"学生3",22,"河北");
//把学生对象添加到集合中
array.add(s1);
array.add(s2);
array.add(s3);
//遍历集合得到每一个学生对象
for(Student s : array){
String result = getString(s);
bw.write(result);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
}
public static String getString(Student s) {
StringBuilder sb = new StringBuilder();
sb.append(s.getSid()).append(", ").append(s.getName()).append(", ").append(s.getAge()).append(", ").append(s.getAddress());
String ss = sb.toString();
return ss;
}
}
5.文件到集合(升级版)
需求:把文本文件中的数据读取到集合中,并遍历集合。要求:文件中每一行数据是一个学生对象的成员变量值
代码实现:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class FileToArrayListDemo {
public static void main(String[] args) throws IOException {
//创建字符缓冲输出流对象
BufferedReader br = new BufferedReader(new FileReader("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\Student.txt"));
//创建ArrayList集合
ArrayList<Student> array = new ArrayList<>();
//读取数据
String line;
while((line = br.readLine())!= null) {
//将字符串按一定格式分割,得到一个数组
String[] StrArr = line.split(", ");
//创建学生对象
Student s = new Student();
s.setSid(Integer.parseInt(StrArr[0]));
s.setName(StrArr[1]);
s.setAge(Integer.parseInt(StrArr[2]));
s.setAddress(StrArr[3]);
//把学生对象添加到集合
array.add(s);
}
//释放资源
br.close();
//遍历集合
for(Student s :array){
System.out.println(s.getSid()+", "+s.getName()+", "+s.getAge()+", "+s.getAddress());
}
}
}
6.集合到文件(数据排序升级版)
需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求按照成绩总分从高到低写入文本文件
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class TreeSetToFile {
public static void main(String[] args) throws IOException {
//创建TreeSet集合,通过比较器排序进行排序
TreeSet<Student1> ts = new TreeSet<>(new Comparator<Student1>() {
@Override
public int compare(Student1 s1, Student1 s2) {
int num = s2.sum() - s1.sum();
int num2 = num == 0 ? s2.getEnglishScore() - s1.getEnglishScore() : num;
int num3 = num2 == 0 ? s2.getChineseScore() - s1.getChineseScore() : num2;
int num4 = num3 == 0 ? s2.getName().compareTo(s1.getName()) : num3;
return num4;
}
});
for(int i =0;i<3;i++){
//键盘录入学生数据
Scanner sc = new Scanner(System.in);
System.out.println("请录入第"+(i+1)+"个学生的信息:");
System.out.println("请输入学生姓名");
String name = sc.nextLine();
System.out.println("请输入学生语文成绩");
int chineseScore = sc.nextInt();
System.out.println("请输入学生数学成绩");
int mathScore = sc.nextInt();
System.out.println("请输入学生英语成绩");
int englishSore = sc.nextInt();
//创建学生对象
Student1 s = new Student1();
//将键盘录入的值赋给成员变量
s.setName(name);
s.setChineseScore(chineseScore);
s.setEnglishScore(englishSore);
s.setMathScore(mathScore);
//将学生对象添加到集合中
ts.add(s);
}
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("F:\\JAVA\\JAVA Document\\Review\\src\\TEMP\\TEMP27\\Student1.txt"));
//遍历集合
for(Student1 s : ts) {
String ss = getString(s);
bw.write(ss);
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
}
//定义获得指定格式字符串的方法
public static String getString(Student1 s) {
StringBuilder sb = new StringBuilder();
sb.append(s.getName()).append(", ").append(s.getChineseScore()).append(", ").append(s.getEnglishScore()).append(", ").append(s.getMathScore()).append(", ").append(s.sum());
String ss = sb.toString();
return ss;
}
}
7.复制单级文件夹
代码实现:
import java.io.*;
public class CopyFolderDemo {
public static void main(String[] args) throws IOException {
//创建数据源目录
File srcFolder = new File("F:\\testCopyTEMP27");
//获取数据源目录File对象的名称(TEMP27)
String srcFolderName = srcFolder.getName();
//创建目的地目录File对象,路径名是模块名+TEMP27
File destFolder = new File("src\\TEMP",srcFolderName);
//判断目的地目录对应的File是否存在,如果不存在,就创建
if(!destFolder.exists()){
destFolder.mkdir();
}
//获取数据源目录下的所有文件的File数组
File[] listFile = srcFolder.listFiles();
//遍历数组获得每一个文件
for(File file : listFile) {
//获取每个文件的文件名
String fileSrcName = file.getName();
//创建目的地文件的File对象
File destFile = new File(destFolder,fileSrcName);
//复制文件
copyFile(file,destFile);
}
}
private static void copyFile(File file, File destFile) throws IOException {
//创建字节输入输出缓冲流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
//读写数据(一次读一个字节数组)
byte[] bys = new byte[1024];
int len;
while((len = bis.read(bys))!=-1){
bos.write(bys,0,len);
}
//释放资源
bis.close();
bos.close();
}
}
8.复制多级文件夹
import java.io.*;
public class CopyProDemo {
public static void main(String[] args) throws IOException {
//创建数据源对象File
File srcFile = new File("F:\\testCopyTEMP27");
//创建目的地File对象
File destFile = new File("src\\TEMP");
//写方法实现文件夹的复制
copyFolder(srcFile, destFile);
}
private static void copyFolder(File srcFile, File destFile) throws IOException {
//判断数据源File是否为目录
if (srcFile.isDirectory()) {
//在目的地创建名字一样的目录
String srcFileName = srcFile.getName();
File newDestFolder = new File(destFile, srcFileName);
if (!newDestFolder.exists()) {//判断是否存在
//创建新的文件夹
newDestFolder.mkdir();
}
//获取数据源File下的所有文件或者目录的数组
File[] FileArray = srcFile.listFiles();
//遍历该数组,获取每一个File对象
for (File file : FileArray) {
copyFolder(file, newDestFolder);
}
} else {
//创建一个新的文件名与源文件相同的路径
File newDestFile = new File(destFile,srcFile.getName());
copyFile(srcFile,newDestFile);
}
}
private static void copyFile(File file, File destFile) throws IOException {
//创建字节输入输出缓冲流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
//读写数据(一次读一个字节数组)
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1) {
bos.write(bys, 0, len);
}
//释放资源
bis.close();
bos.close();
}
}
(六)复制文件的异常处理
代码演示:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class ExceptionDemo {
public static void main(String[] args) {
}
//处理异常方法1(直接抛出)
private static void method1() throws IOException {
FileReader fr = new FileReader("fr.txt");
FileWriter fw = new FileWriter("fw.txt");
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
}
fr.close();
fw.close();
}
//处理异常方法2(正常try...catch..finally标准格式处理异常)
private static void method2() {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("fr.txt");
fw = new FileWriter("fw.txt");
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fw != null) {
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//处理异常方法3(JDK7的改进方案)
private static void method3() {
try (FileReader fr = new FileReader("fr.txt");
FileWriter fw = new FileWriter("fw.txt");){
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
//处理异常方法4(JDK9的改进方案)
private static void method4() throws IOException{ //此处相对JDK7来说还要抛出异常
FileReader fr = new FileReader("fr.txt");
FileWriter fw = new FileWriter("fw.txt");
try (fr;fw){ //注意此处是分号;而不是逗号,
char[] chs = new char[1024];
int len;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}