对比字节流和字符流,回答为何FileReader不能用来拷贝图片

  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读图片,就像用记事本打开图片,由于记事本一遇到二进制数据就拿码表来“翻译”,可码表并非每一个格子都用到容易致使数据丢失。

相关文章
相关标签/搜索