1. 程式人生 > >Java IO操作常犯的錯

Java IO操作常犯的錯

讀寫資料時的坑

  • 如果檔案比較大時,一次性讀取可能會出現記憶體溢位的情況

    byte[] bytes = new bytes[is.available()];
    is.read(bytes);
    
  • 迴圈讀取,寫出時可能會出現有重複位元組

    byte[] bytes = new bytes[1024];
    int len;
    while((len = is.read(bytes))!=-1){
    	// os.write(bytes);  可能出現重複位元組
    	os.write(bytes,0,len);
    }
    
  • 使用BufferedInputStream(InputStream)/BufferedOutputStream(OutputStream)

    位元組緩衝流時,可能會出現資料不完整。對於字元流,也有字元緩衝流BufferedReader/BufferedWriter,並且提供readLine()newLine()方法

    	int len;
    	while((len = bis.read())!=-1){
    		bos.write(len);
    	}
    	// 一定要關閉流或者重新整理流,因為如果不執行close或者flush,那麼拷貝的資料可能要小一點。
    	// 為什麼會小?因為緩衝區中可能還有資料沒有重新整理到磁碟。
    	bis.close();
    	bos.close();
    
  • 位元組流讀寫中文可能出現亂碼

    一箇中文字是兩個位元組,假如使用read()

    讀取,那麼必定會出現一箇中文字被讀取兩次,這樣會導致亂碼。讀取中文資料時,建議使用字元流,在寫出中文時,必須要將中文轉成位元組陣列。

    OutputStream os = new FileOutputStream("D://test.txt");
    os.write("我讀書少 你不要騙我".getBytes());
    
  • 字元流不能拷貝非純文字,因為讀取的時候會將位元組轉成字元,在轉換過程中,找不到的字元就會用“?”來代替