首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java IO 文件複製常見錯誤:read() 返回值誤用導致數據丟失

     編輯:Java 綜合教學

Java IO 文件複製常見錯誤:while 循環中誤調用 read() 導致首字節丟失

需求:將 D:/good boy.txt 複製到 C:/myFile.txt。

錯誤代碼示例

while ((fis.read()) != -1) { // 錯誤:這裡已消費一個位元組
    fis.read(words);          // 從第二個位元組開始讀入數組
    fos.write(words, 0, words.length); // 寫入整個數組長度,而非實際讀取長度
}

錯誤分析

  1. fis.read() 在判斷條件中單獨調用,消費了流中的第一個位元組,且未保存。
  2. 隨後 fis.read(words) 從第二個位元組開始讀取,導致數據缺失首字節。
  3. fos.write(words, 0, words.length) 使用數組總長度而非實際讀取長度 len,會將數組殘留的舊數據或零值寫入目標文件。

正確寫法

FileInputStream fis = null;
FileOutputStream fos = null;
try {
    fis = new FileInputStream("D:/good boy.txt");
    fos = new FileOutputStream("C:/myFile.txt");
    byte[] buffer = new byte[1024];
    int len;
    while ((len = fis.read(buffer)) != -1) { // 讀取並判斷在同一表達式
        fos.write(buffer, 0, len);         // 按實際讀取長度寫入
    }
    fos.flush();
    System.out.println("複製完成");
} catch (IOException e) {
    e.printStackTrace();
} finally {
    try { if (fis != null) fis.close(); } catch (IOException ignore) {}
    try { if (fos != null) fos.close(); } catch (IOException ignore) {}
}

核心要點

  • 讀取與判斷合併:(len = fis.read(buf)) != -1,確保每個位元組只被讀取一次並參與判斷。
  • 寫入用實際長度:fos.write(buf, 0, len),避免寫入垃圾數據。
  • 資源關閉放 finally:並單獨 try-catch 關閉每個流,防止一個關閉失敗導致另一個未關閉。
  • JDK 7+ 建議使用 try-with-resources 自動管理資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved