對比字節流和字符流,回答爲何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讀圖片,就像用記事本打開圖片,由於記事本一遇到二進制數據就拿碼錶來「翻譯」,可碼錶並非每一個格子都用到容易致使數據丟失。

相關文章
相關標籤/搜索