一、字符流知识点总结
二、两道经典练习题
1、复制单级文件夹
单级文件夹:该文件夹中不再包含有子文件夹,仅包含各类文件。
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 案例:复制单级文件夹(一个目录下没有子目录,只有文件)
* 需求:把"D:\\itcase"这个文件夹复制到模块目录下
* 思路:
* 1、创建数据源目录File对象,路径是D:\\itcase
* 2、获取数据源目录File对象的名称(itcase)
* 3、创建目的地目录File对象,路径名是模块名+itcase组成(src\\itcase)
* 4、判断目的地目录对应的File是否存在,若不存在,就创建
* 5、获取数据源目录下所有文件的File数组
* 6、遍历File数组,得到每一个File对象,该File对象,就是数据源文件
* 7、获取数据源文件File对象的名称
* 8、创建目的地文件File对象,路径名是目的地目录+mn.jpg组成(src\\itcase\\mn.jpg)
* 9、复制文件
* 由于文件不仅仅是文本文件,还有图片,所以采用字节流复制文件
*/
public class IoDemo1 {
public static void main(String[] args) throws IOException{
//1、创建数据源目录File对象,路径是D:\\itcase
File srcFolder=new File("D:\\itcase");//这里的File对象是一个目录
//2、获取数据源目录File对象的名称(itcase)
String srcFolderName=srcFolder.getName();//保证程序的可维护性
//3、创建目的地目录File对象,路径名是模块名+itcase组成(src\\itcase)
//File copyFile=new File("src//"+name);//是错误的
File destFoler=new File("src",srcFolderName);
//4、判断目的地目录对应的File是否存在,若不存在,就创建
if(!destFoler.exists()) {//若存在,则直接覆盖掉里面的文件
destFoler.mkdir();
}
//5、获取数据源目录下所有文件的File数组
File[] listFiles=srcFolder.listFiles();//得到的是文件,而不是目录(因为是单级目录)
//6、遍历File数组,得到每一个File对象,该File对象,就是数据源文件
for(File srcFile:listFiles) {
//7、获取数据源文件File对象的名称
String srcFileName=srcFile.getName();
//创建目的地文件File对象,路径名是目的地目录+mn.jpg组成(src\\itcase\\mn.jpg)
//得到的是文件,不是目录
File destFile=new File(destFoler,srcFileName);
//9、复制文件
//只能把文件复制到文件中去,不能直接把文件复制给一个文件夹
copy(srcFile,destFile);
}
}
private static void copy(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,0,len);
}
bos.close();
bis.close();
}
}
2、复制多级文件夹
多级文件夹:该文件夹下可能包含有子文件夹,也可能包含有文件;它的子文件夹下还可能有文件夹及文件。
本次程序采用递归的方式,来遍历文件夹。
package io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 案例:复制多级文件夹(一个目录下不仅有子目录,还有文件)
* 需求:把"D:\\itcase"这个多级文件夹复制到F盘下
* 思路:
* 1、创建数据源目录File对象,路径是D:\\itcase
* 2、创建目的地File对象,路径是C:\\
* 3、写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
* 4、判断数据源File是否是目录:
* 5、是:
* A:在目的地下创建和数据源File名称相同的目录
* B:获取数据源File所有文件或者目录的File数组
* C:遍历该File数组,得到每一个File对象
* D:把该File对象作为数据源对象,递归调用复制文件夹的方法
* 不是:说明是文件,由于文件不仅仅是文本文件,还有图片,所以采用字节流复制文件
*/
public class IoDemo1 {
public static void main(String[] args) throws IOException{
//1、创建数据源目录File对象,路径是D:\\itcase
//FileNotFoundException
File rawFolder=new File("D:\\itcase");//封装源文件路径
//2、创建目的地File对象,路径是C:\\
File destFolder=new File("C:\\");//封装目的地路径
//3、写方法实现文件夹的复制,参数为数据源File对象和目的地File对象
//copyFile(rawFolder,destFolder);
copyFolder(rawFolder,destFolder);//调用复制文件夹的方法
}
private static void copyFolder(File rawFolder, File destFolder) throws IOException {
// 4、判断数据源File是否是目录:
if(rawFolder.isDirectory()) {//如果源文件是目录
//A:在目的地下创建和数据源File名称相同的目录
String rawFolderName=rawFolder.getName();//先创建一个"E:\\itcase"
File newFolder=new File(destFolder,rawFolderName);//只是封装了路径,没有创建目录
if(!newFolder.exists()) {
newFolder.mkdir();
}
//B:获取数据源File所有文件或者目录的File数组
File[] arrFile=rawFolder.listFiles();//得到源文件路径中的所有File对象
//C:遍历该File数组,得到每一个File对象
for(File file:arrFile) {
//D:把该File对象作为数据源对象,递归调用复制文件夹的方法
copyFolder(file,newFolder);//无论这些File对象是不是文件夹,都调用复制文件夹的方法
}
}
else {
File newFile=new File(destFolder,rawFolder.getName());
copyFile(rawFolder,newFile);
}
}
//字节缓冲流复制文件
private static void copyFile(File rawFolder, File newFile) throws IOException {
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(newFile));
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(rawFolder));
byte[] bys=new byte[1024];
int len;
while((len=bis.read())!=-1) {
bos.write(bys,0,len);
}
bos.close();
bis.close();
}
}
三、结合具体的类,来使用字符流
学生类:
package io;
public class Student implements Comparable<Student>{
//public class Student {
private String name;
private int mathScore;
private int chineseScore;
private int englishScore;
public Student() {
super();
}
public Student(String name, int mathScore, int chineseScore,int englishScore) {
super();
this.name = name;
this.mathScore = mathScore;
this.chineseScore = chineseScore;
this.englishScore=englishScore;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the mathScore
*/
public int getMathScore() {
return mathScore;
}
/**
* @return the chineseScore
*/
public int getChineseScore() {
return chineseScore;
}
public int getenglishScore() {
return englishScore;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @param mathScore the mathScore to set
*/
public void setMathScore(int mathScore) {
this.mathScore = mathScore;
}
/**
* @param chineseScore the chineseScore to set
*/
public void setChineseScore(int chineseScore) {
this.chineseScore = chineseScore;
}
public void setenglishScore(int englishScore) {
this.englishScore = englishScore;
}
public int getSumScore() {
return this.chineseScore+this.mathScore+this.englishScore;
}
@Override
public String toString() {
return name+","+mathScore+","+chineseScore+","+englishScore+","+this.getSumScore();
}
public int compareTo(Student other) {
//int diff=(Integer.compare(this.getSumScore(), other.getSumScore()))*(-1);
int diff=other.getSumScore()-this.getSumScore();
int diff1=diff==0?this.getChineseScore()-other.getChineseScore():diff;
int diff2=diff1==0?this.getMathScore()-other.getMathScore():diff1;
int diff3=diff2==0?this.getName().compareTo(other.getName()):diff2;
return diff3;
}
}
主类:
package io;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/*
* 案例:集合到文件(数据排序改进版)
* 需求:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)
* 要求按照成绩总分从高到低写入文本文件
* 格式:姓名,语文成绩,数学成绩,英语成绩
* 举例:林青霞,98,99,100
*/
import java.util.Scanner;
import java.util.*;
public class IoDemo1 {
public static void main(String[] args) throws IOException{
//通过比较器排序进行排序
TreeSet<Student>trs=new TreeSet<Student>();
// TreeSet<Student>trs=new TreeSet<Student>(new Comparator<Student>() {
//
// @Override
// public int compare(Student s1, Student s2) {
// //主要条件
// int num=s2.getSumScore()-s1.getSumScore();
// //次要条件
// int num1=num==0?s1.getChineseScore()-s2.getChineseScore():num;
// int num2=num1==0?s1.getMathScore()-s2.getMathScore():num1;
// int num3=num2==0?s1.getName().compareTo(s2.getName()):num2;
// return num3;
// }
//
// });
Scanner in=new Scanner(System.in);
for(int i=1;i<6;i++) {
System.out.println("请输入第"+i+"个学生的成绩:(格式为:林青霞,98,99,100)");
String line=in.nextLine();
String[] str=line.split(",");
Student s=new Student();
s.setName(str[0]);
s.setChineseScore(Integer.parseInt(str[1]));
s.setMathScore(Integer.parseInt(str[2]));
s.setenglishScore(Integer.parseInt(str[3]));
trs.add(s);
}
in.close();
BufferedWriter bfw=new BufferedWriter(new FileWriter("D:\\troye.txt"));
String s;
for(Student stu:trs) {
s=stu.toString();
bfw.write(s);
bfw.newLine();
bfw.flush();
}
bfw.close();
}
}
四、总结
今天可能是学java以来效率最高的一天,各种知识点掌握得也很快。别看每一次的练习都不难,但是还是很容易出现岔子。以前在集合排序这一块还是会纠结老半天,想不出来。今天学着学着突然顿悟了,发现不过就是那么回事。所以如果当下没有解决的技术问题,先放在一边,慢慢地在后续的学习中会找到答案的!