java文件复制-字符流
Posted 小女子不才~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java文件复制-字符流相关的知识,希望对你有一定的参考价值。
前记:欠下的迟早是要还的~~还债第二篇!
上一篇文章讲了使用字节流复制,这一篇主要解释字符流复制文件。最后有字节流和字符流的区别。
字符流的体系
抽象顶层父类:Reader(读取)和Writer(写入)
字符流具体子类:FileReader和FileWriter
Reader的常用方法
- close
- read()
- read(char[] arr):一次读取一组字符放到arr中,返回值表示放到数组中的字符个数
Writer的常用方法
- close
- flush
- 字符流拷贝效率提升write(int c):写出一个字符
- write(String str): 写出一个字符串
- write(char[] arr):
- write(char[] arr,int offset,int len):
都是抽象类,不能实例化,需要使用子类对象来调用方法
字节流处理字符问题
- 需要先把字符变为字节数组,才能写到目标文件中
字节读取字符
- 纯英文,每次读取一个字节
- 纯中文,每次读取两个字节(GBK) UTF-8一次读取3个
- 中英文混杂,每次不知道要读取多少字节
字符流的拷贝使用场景:
- 如果在读取字符之后,需要人为阅读,或修改之类,就有必要使用字符流了
- 如果只单纯的文件拷贝,就不需要使用
字符流不能操作流媒体文件:当字符流读取到字节信息,先查询编码表,将其转为字符信息,如果是非纯文本文件了,就有可能读取的字节信息无法转为对应的字符,因为字节信息在编码表中查不到,就会使用?来替代,再输出时,就能查到?的编码,则导致了字节信息被篡改,导致文件不可用
字符流拷贝效率提升同字节流,使用FileReader的read(char[] arr)一次读取一个小数组的字符,能减少io的次数,提高读取效率,同样FileWriter write(char[] arr) 一次写出一个小数组,增加效率。
@Test
public void copyBystr(){
try {
//创建一个读入字符流
FileReader reader=new FileReader(new File("D:\\\\test\\\\test.txt"));
//创建一个输出字符流
FileWriter writer=new FileWriter(new File("d:\\\\test\\\\test33.txt"));
//定义读入,输出缓冲流 ,传
//创建一个搬运工具
char data[]=new char[20];
//创建 长度
int len=0;
long start = System.currentTimeMillis();
//从缓冲流中读取 表示从该输入读取最1024*8字节的数据流到字节数组data[]中
while((len=reader.read(data))!=-1){
writer.write(data,0,len);//从指定字节数组data写入len字节从偏移off开始到此文件输出流,off=0,因为write里默认事append
}
long end = System.currentTimeMillis();
System.out.println("复制文件耗时:"+(end-start));
//关闭流的时候 ,后开的先关
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
字符的高效缓冲流
和字节同理,只不过数组换成了char
- BufferedReader
- BufferedWriter
高效缓冲流特有的方法
BufferedReader
- readLine(): 可以从流中,一次读取一行文本,返回一个String对象,读取到末尾的时候返回null;
BufferWriter
- newLine(): 写出一个换行符
代码示例:
@Test
public void copyByBufferStr(){
try {
//创建一个读入字符流
FileReader reader=new FileReader(new File("D:\\\\test\\\\test.txt"));
//创建一个输出字符流
FileWriter writer=new FileWriter(new File("d:\\\\test\\\\test44.txt"));
//定义增强流
BufferedReader bufferedReader = new BufferedReader(reader);
BufferedWriter bufferedWriter = new BufferedWriter(writer);
//创建一个搬运工具
char data[]=new char[20];
//创建 长度
int len=0;
long start = System.currentTimeMillis();
//从缓冲流中读取 表示从该输入读取最1024*8字节的数据流到字节数组data[]中
while((len=bufferedReader.read(data))!=-1){
bufferedWriter.write(data,0,len);//从指定字节数组data写入len字节从偏移off开始到此文件输出流,off=0,因为write里默认事append
}
long end = System.currentTimeMillis();
System.out.println("复制文件耗时:"+(end-start));
//关闭流的时候 ,后开的先关
bufferedReader.close();
bufferedWriter.close();
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void readLine(){
try {
//创建一个读入字符流
FileReader reader=new FileReader(new File("D:\\\\test\\\\test2.txt"));
//创建一个输出字符流
//定义增强流
BufferedReader bufferedReader = new BufferedReader(reader);
String str;
while ((str=bufferedReader.readLine())!=null){
System.out.println(str);
}
//关闭流的时候 ,后开的先关
bufferedReader.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
字节流和字符流的区别:
(1)每次读写的字节数不同;字符流是快读写,字节流是字节读写
(2)字符流带有缓存,字节流没有。
(3)字符流处理的单元为2个字节的Unicode字符,分别操作字符,字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
字符流和字节流,一个属性范围小,一个属性范围大,字符流只能是字符这一种类型,但是字节流中可以是字符,可以是二进制文件,可以是音频,可以是各种各样的类型,只要符合字节形式存储的都可以接字节流,而字符流只能接字符。
后记:天道好轮回,苍天饶过谁~~,欠下的迟早是要还的~
以上是关于java文件复制-字符流的主要内容,如果未能解决你的问题,请参考以下文章