5/18笔记
作者:互联网
集合到文件(数据排序改进版):
键盘录入三个学生信息(姓名,语文成绩,数学成绩,英语成绩)。要求按照成绩总分从高到低写入文本文件。
格式:姓名,语文成绩,数学成绩,英语成绩
思路:
- 定义学生类
- 创建TreeSet集合,定义比较器(难点)
- 键盘录入学生数据(难点,Scanner运用不熟练)
- 创建学生对象,将键盘录入的数据对应赋值给学生对象的成员变量
- 将学生对象添加到TreeSet集合
- 创建字符缓冲输出流对象
- 遍历集合,得到每一个学生对象
- 将学生对象的数据拼接成指定格式字符串
- 写出数据
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//成绩总分从高到低
int num = o2.getSum() - o1.getSum();
//如果总成绩相同比较语文成绩
int num2 = (num == 0) ? o2.getChinese() - o1.getChinese() : num;
//如果总成绩和语文成绩相同比较数学成绩
int num3 = (num2 == 0) ? o2.getMath() - o1.getMath() : num2;
//如果总成绩,语文成绩和数学成绩都相同,比较英语成绩
int num4 = (num3 == 0) ? o2.getEnglish() - o1.getEnglish() : num3;
return num4;
}
});
//键盘录入学生数据
for (int i = 0; i < 5; i++) {
Scanner sr = new Scanner(System.in);
System.out.println("Please input the" + (i + 1) + "student's grades");
System.out.println("name:");
String name = sr.nextLine();
System.out.println("chinese grade:");
int chinese = sr.nextInt();
System.out.println("math grade:");
int math = sr.nextInt();
System.out.println("english grade:");
int english = sr.nextInt();
Student s = new Student(name, chinese, math, english);
//把学生对象添加到treeset集合
ts.add(s);
}
//创建字符缓冲输出流对象
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IdeaProject\\untitledDemo\\test.txt"));
//遍历集合,得到每一个学生对象
for (Student s : ts){
//拼接要写入到文件的字符串
StringBuilder sb = new StringBuilder();
sb.append(s.getName()).append(",").append(s.getChinese()).append(",").append(s.getMath()).append(",").append(s.getEnglish());
bw.write(sb.toString());
bw.newLine();
}
bw.flush();
bw.close();
复制单级文件夹:
将D盘下的itcast下的文件(里面没有文件夹)复制到D盘下IdeaProject里的untitledDemo里。
//创建数据源目录
File srcFolder = new File("D:\\itcast");
//获取目录下的文件对象名称
String srcFolderName = srcFolder.getName();
//创建模块下的抽象路径
File destFolder = new File("D:\\IdeaProject\\untitledDemo",srcFolderName);
//判断此路径的文件是否存在,不存在,创建文件夹
if (!destFolder.exists()){
destFolder.mkdir();
}
File[] listFiles = srcFolder.listFiles();
for (File srcFile:listFiles){
String srcFileName = srcFile.getName();
File destFile = new File(destFolder,srcFileName);
copyFile(srcFile,destFile);
}
}
private static void copyFile(File srcFile, File destFile) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1){
bos.write(bys);
}
bos.flush();
bos.close();
bis.close();
}
复制多级文件夹:
将D盘下的itcast下的文件(里面还有文件夹)复制到D盘下IdeaProject里的untitledDemo里。
- 创建数据源File对象:D:\\itcast
- 创建目的地File对象:D:\\itcast\\IdeaProject\\untitledDemo
- 写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
- 判断数据源File是否为目录: 是的话,创建和数据源一样的File目录,获取数据源的File数组,遍历数组得到每一个File对象,并将这些File对象作为数据源File对象递归调用copyFolder方法. 不是的话,直接调用copyFile方法
public static void main(String[] args) throws IOException {
//创建数据源文件和目的地文件
File srcFile = new File("D:\\itcast");
File destFile = new File("D:\\IdeaProject\\untitledDemo");
copyFolder(srcFile,destFile);
}
private static void copyFolder(File srcFile, File destFile) throws IOException {
//判断srcFile是否为目录
if (srcFile.isDirectory()){
//获取目录名,并在目的地文件夹内创建相同的目录
String srcFileName = srcFile.getName();
File newFolder = new File(destFile,srcFileName);//newFolder:untitledDemo\\itcast
if (!newFolder.exists()){
newFolder.mkdir();
}
//遍历srcFile里的所有File
File[] files = srcFile.listFiles();
for (File file:files){
copyFolder(file,newFolder); //javaDemo.txt,untitledDemo\\itcast
}
} else {
//说明是文件,直接复制
File newFile = new File(destFile, srcFile.getName());//untitledDemo\\itcast, javaDemo.txt
copyFile(srcFile, newFile);//D:\\itcast\\javeDemo.txt, untitledDemo\\itcast\\javaDemo.txt
}
}
private static void copyFile(File srcFile, File destFile) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1){
bos.write(bys);
}
bos.flush();
bos.close();
bis.close();
}
复制文件的异常处理的三种方法:
前两种是重点
标准输入流:
之前的字符输入流中,FileReader是InputStreamReader的子类。他们俩的比较代码如下:
//使用缓冲字符流读取文件
BufferedReader br = new BufferedReader(new FileReader("D:\\IdeaProject\\untitledDemo\\text.txt"));
//代码功能和上面的一样
BufferedReader br2 = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\IdeaProject\\untitledDemo\\text.txt"),"utf-8"));
使用InputStreamReader读取键盘输入字符,一次只能读取一个字符
InputStreamReader input = new InputStreamReader(System.in);
//只能一次读取一个字符
int read = input.read();
System.out.println((char) read);
使用BfferedReader读取键盘输入,一次可以读取一行
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(input);
//只能一次读取一个字符
String s = br.readLine();
System.out.println(s);
今日学习感悟:
今天从308看到312,四节。还算挺难的这几节,不要给自己加任务!!!量力而行!!
标签:itcast,srcFile,int,18,笔记,untitledDemo,File,new 来源: https://blog.csdn.net/Nina19980917/article/details/116982086