1. 字符流=字节流+编码表。一般用来处理中文文本文件
OutputStreamWriter=FileOutputStream + 编码表(GBK)默认的是GBK。
FileWriter = FileOutputStream + 编码表(GBK)
InputStreamReader = FileInputStream + 编码表(GBK)
FileReader = FileInputStream + 编码表(GBK)
2. 字节流的子类:
输出流:
OutputStreamWriter:
FileWriter (用来替代OutputStreamWriter)
BufferedWriter:
输入流:
InputStreamReader :
FileReader (用来替代InputStreamReader )
BufferedReader:
3. 字符流复制文件的5种方式:
第一种:字符流一次读取一个字符
//封装数据源和目的地
FileReader fr = new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3");
FileWriter fw = new FileWriter("f.mp3");
// 一次读取一个字符
int by = 0;
while ((by = fr.read()) != -1) {
fw.write(by);
}
//释放资源
fr.close();
fw.close();
第二种:字符流一次读取一个字符数组
FileReader fr = new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3");
FileWriter fw = new FileWriter("c.mp3");
// 一次读取一个一个字符数组
int len = 0;
char[] array = new char[1024];
while ((len = fr.read(array)) != -1) {
fw.write(array, 0, len);
}
fr.close();
fw.close();
第三种:高效字符流一次读取一个字符
BufferedReader br = new BufferedReader(new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3"));
BufferedWriter bw = new BufferedWriter(new FileWriter("d.mp3"));
int by = 0;
while ((by = br.read()) != -1) {
bw.write(by);
}
bw.close();
br.close();
第四种:高效字符流一次读取一个字符数组
BufferedReader br = new BufferedReader(new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e.mp3"));
int by = 0;
char [] array=new char[1024];
while ((by = br.read(array)) != -1) {
bw.write(array,0,by);
}
bw.close();
br.close();
第五种:字符缓冲流一次读取一行数据
//字符缓冲流 一次读取一行
BufferedReader br = new BufferedReader(new FileReader("D:\\KuGou\\李克勤 - 天梯.mp3"));
BufferedWriter bw = new BufferedWriter(new FileWriter("e.mp3"));
String ss=null;
//如果已达文件末尾,则返回null
//readLine()方法,遇到\r \n则停止
while ((ss = br.readLine()) != null) {
bw.write(ss);
bw.newLine();
//刷新缓冲区
bw.flush();
}
bw.close();
br.close();
4. flush()和close()的区别:
close()表示关闭流对象,但是先刷新一次缓冲区,关闭之后,流对象就不能使用了
flush()表示刷新一次缓冲区,刷新之后,流对象还能继续使用
5. 复制多级文件到指定目录
// 封装数据源、目的地:
File file = new File("D:\\java\\程序");
File files = new File("D:\\java\\程序副本");
//如果文件夹不存在,将自动创建
if(!files.exists()){
files.mkdir();
}
//调用方法,进行递归判断
method(file,files);
}
public static void method(File file, File files) throws IOException {
if(file.isFile()){
//如果是文件,就直接复制
//先把名字封装到指定文件夹下
File newFile=new File(files,file.getName());
//在复制文本文件
copy(file,newFile);
}
else{
//是文件夹的话,就把文件夹复制到指定目录,在调用方法判断
File newFile=new File(files,file.getName());
//创建文件夹
newFile.mkdir();
//获取该文件夹的file数组
File[] array=file.listFiles();
//遍历数组,得到每个file对象
for(File newFiles:array){
//再重新判断
method(newFiles,newFile);
}
}
}
public static void copy(File file, File newFile) throws IOException {
//封装数据源,目的地
BufferedReader br=new BufferedReader(new FileReader(file));
BufferedWriter bw=new BufferedWriter(new FileWriter(newFile));
String s=null;
while((s=br.readLine())!=null){
bw.write(s);
bw.newLine();
bw.flush();
}
br.close();
bw.close();
6. LineNumberReader的使用
继承自BufferedReader,
LineNumberReader lnr=new LineNumberReader(new FileReader("a.txt"));
String s=null;
lnr.setLineNumber(10);
//设置行号,从10开始
while((s=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+":"+s);
//输出文字前面的行号
}
lnr.close();
输出结果是:
11:Hello
12:好好学习,天天上向!
13:渴望成熟一点!
7. 字符串中的编码问题:
String(byte[] bytes, String charsetName) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
byte[] getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
//编码问题
String s="我四级考试没过";
byte[] by=s.getBytes();//默认编码GBK
System.out.println(Arrays.toString(by));
//一个汉字两个字节,并且是以负数开头
//[-50, -46, -53, -60, -68, -74, -65, -68, -54, -44, -61, -69, -71, -3]
byte [] bys=s.getBytes("UTF-8");//指定编码
//解码
String s1=new String(by);
String s2=new String(bys,"UTF-8");
System.out.println(s1+"---"+s2);
//我四级考试没过---我四级考试没过
//用GBK编码,"UTF-8"解码
String s3=new String(by,"UTF-8");
System.out.println(s3);
//????????????
//用"UTF-8"编码,GBK解码
String s4=new String(bys);
System.out.println(s4);
//鎴戝洓绾ц?冭瘯娌¤繃
所以用什么编码,就用什么解码。8. 如何实现数据的追加写入
通过构造方法
public FileOutputStream (File file , boolean append) throws FileNotFoundException
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
创建一个新 FileDescriptor 对象来表示此文件连接。
9. close()的功能
让流对象变成垃圾,这样就可以被垃圾回收器回收了
通知系统去释放与该文件相关的资源