一、字节流与字符流的区别
1、操作的数据单元不同
- 字节流操作的是字节
- 字符流操作的是字符
2、可以实现的功能不同
-
FileInputSteam和FileOutputStream可以完成所有格式文件的复制;
-
FileReader和FileWriter只能完成文本格式的复制,无法完成视频、音频等文件的复制;
一句话总结:字节流能处理所有类型的数据(如图片、视频等),而字符流只能处理字符类型的数据。
3、为什么实现的区别功能不同?
-
1、字节不需要解码编码,将字节转化为字符才需要进行解码编码的问题;
-
2、字节流可以从所有设备中读写数据,但字符流只能从文本格式的设备中读写数据;
注:当程序需要从显示器中显示时,带有中文等字符形式的文件使用字节流因为需要解码编码会出现乱码,无法正确输出;
使用字符流复制音频文件 Demo 代码示例:
public class TestCopy {
public static void main(String[] args) {
FileReader fi=null;
FileWriter fo=null;
try {
fi=new FileReader("D:\\朴树 - 平凡之路.flac");//用字符流复制一个音频文件
fo=new FileWriter("C:\\Users\\86152\\Desktop\\新建文件夹\\yy.flac");
int i;
while(-1!=(i=fi.read())) {
fo.write(i);
}
}
catch(FileNotFoundException e) {
System.out.printf("文件没有找到!\n");
System.exit(-1);
}
catch(IOException e) {
System.out.printf("文件读写错误!\n");
System.exit(-1);
}
finally {
try {
if(fi!=null) {
fi.close();
fi=null;
}
if(fo!=null) {
fo.close();
fo=null;
}
}
catch(Exception e) {
e.printStackTrace();
System.exit(-1);
}
}
System.out.printf("复制成功!\n");
}
}
运行结果:虽然文件看着复制完成了,但是文件内部呈现破损状态,无法使用。