FileReader是输入字符流,拷贝文件没问题,但拷贝图片就有问题了。windows
假设是在windows下,FileReader用的是GBK码表,一个字符最多用2个字节表明。2个字节就是2的16次方,即有65536个格子范围,但GBK码表并无将这些格子都用完,当读到某个二进制,假设是12421(我这里用二进制的十进制说明,二进制写起来太长)对应有码值“中”,那就读到完整的2个字节,数据是完整的。测试
但若是是另外一个数字21232没有对应字符(码值),FileReader读到这样的数据对应码表,找不到对应的字符,就会返回一个未知字符所对应的数字,占1个字节(返回值就是测试代码中的content)。既然字节大小读不完整,FileWriter写的时候还能正确吗?数据就是这样丢失的。spa
我在说“中”的时候你们不要蒙圈,读图片为何要谈到码表对应的汉字。汉字只是图片中二进制数据在码表上的对应字符,它能够是汉字之外的其它字符表明均可以,对于GBK码表没有用完的格子,FileReader读到的content就不是真实的数据。翻译
char[] cha = new char[1024];图片
int content = 0;资源
while((content = fileReader.read()) != -1){it
filewriter.writer(content);io
}class
由此咱们也能知道字节流为何能读取完整,由于它不须要码表,读到啥就获得啥,不会由于码表上没有对应字符就丢弃。file
public static void copy() throws IOException {
//目标文件
File inFile = new File("/Users/mac/Documents/123.jpg");
File destFile = new File("/Users/mac/downloads/456.jpg");
//创建数据的输入输出通道
FileInputStream fileInputStream = new FileInputStream(inFile);
FileOutputStream fileOutputStream = new FileOutputStream(destFile);
//创建缓冲数据,边读边写
byte[] buf = new byte[1024];
int length = 0 ;
while((length = fileInputStream.read(buf)) != -1){
fileOutputStream.write(buf,0,length);
}
//关闭资源 原则: 先开后关,后开先关。
fileOutputStream.close();
fileInputStream.close();
}
打一个很好的彼方,用FileReader读图片,就像用记事本打开图片,由于记事本一遇到二进制数据就拿码表来“翻译”,可码表并非每一个格子都用到,容易致使数据丢失。