HOWTO · Java
在 Java 中將位元組寫入檔案
這篇文章展示瞭如何在 Java 中將位元組寫入檔案
本頁內容
本教學示範如何在 Java 中將位元組陣列寫入檔案。標準函式庫提供兩種實用的選擇——用於串流式寫入的 FileOutputStream,以及用於單次呼叫完成寫入的 NIO Files.write() 方法——而 Apache Commons IO 則為已引入該相依性的專案提供 FileUtils.writeByteArrayToFile() 作為便利選項。每個範例都使用 StandardCharsets.UTF_8 將文字轉換為位元組,因此儲存的檔案不會依賴機器的預設字元集。
使用 FileOutputStream 寫入位元組陣列
FileOutputStream 是 java.io 中經典的位元組導向串流。以檔案名稱建構它時,若檔案不存在會建立該檔案,若檔案已存在則會取代其內容;若要改為附加寫入,請將 true 作為第二個建構函式引數傳入。此串流持有作業系統的控制代碼,因此寫入完成後必須關閉——try-with-resources 會自動執行關閉。
執行此範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;
class ByteToFile {
public static void main(String[] args) throws Throwable {
byte[] data = "DelftStack writes bytes".getBytes(StandardCharsets.UTF_8);
try (FileOutputStream out = new FileOutputStream("stream-demo.bin")) {
out.write(data);
}
System.out.println("Wrote " + data.length + " bytes to stream-demo.bin");
}
}
Wrote 23 bytes to stream-demo.bin
getBytes(StandardCharsets.UTF_8) 會以確定性的方式編碼字串;不帶引數呼叫 getBytes() 則使用平台預設字元集,在另一台機器上可能產生不同的位元組。write(data) 會寫入整個陣列,而 write(data, offset, length) 只在需要時寫入其中一段。當建構函式本身失敗時——例如路徑指向一個目錄、父目錄不存在,或缺少寫入權限——Java 會拋出 FileNotFoundException,因此在開啟串流之前,請先選擇一個可寫入的目的地。
使用 Files.write() 寫入位元組陣列
java.nio.file API 將整個操作濃縮為一次呼叫。Files.write() 會開啟路徑、寫入每個位元組並關閉檔案;預設情況下,檔案不存在時會建立檔案,已存在時則會截斷。可傳入開啟選項,例如 StandardOpenOption.APPEND 可改為附加寫入,StandardOpenOption.CREATE_NEW 則會在檔案已存在時讓操作失敗。
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
class ByteToFileNio {
public static void main(String[] args) throws Throwable {
byte[] data = "NIO write sample data".getBytes(StandardCharsets.UTF_8);
Path target = Paths.get("nio-demo.bin");
Files.write(target, data);
System.out.println("Wrote " + data.length + " bytes to nio-demo.bin");
}
}
Wrote 21 bytes to nio-demo.bin
此方法宣告了 IOException,其常見失敗情境描述明確:父目錄不存在時拋出 NoSuchFileException、程序缺少權限時拋出 AccessDeniedException,以及對已存在的檔案傳入 CREATE_NEW 時拋出 FileAlreadyExistsException。當你想要最簡短的標準函式庫寫法,且不需要 FileOutputStream 的開啟串流控制時,請選擇 Files.write()。
使用 Apache Commons IO 寫入位元組陣列
已依賴 Apache Commons IO 的專案可以改為呼叫 FileUtils.writeByteArrayToFile()。請以你的建置所鎖定的版本宣告 Maven 座標 commons-io:commons-io——本文原始版本所示的 2.6 是所提供的範例版本,而非目前的建議版本,因此請確認你打算使用的發布線。
匯入 org.apache.commons.io.FileUtils 後,呼叫方式為 FileUtils.writeByteArrayToFile(new File("doc.txt"), data),其中 data 是任何 byte[],例如 "text".getBytes(StandardCharsets.UTF_8)。此方法會在目的地檔案不存在時建立它,並沿途建立缺少的父目錄——這是 Files.write() 不會執行的步驟——且在寫入前會截斷已存在的檔案。它也會在內部管理串流,因此不會留下需要呼叫者關閉的控制代碼。由於該類別位於第三方 jar 中,此程式碼片段以原始碼形式呈現,而非可執行的範例;對於未引入該相依性的新程式碼,Files.write() 一行即可完成相同的任務。