Java FileOutputStream


建立輸出流

要寫入檔案,需要建立一個FileOutputStream類的物件,它將表示輸出流。

// Create a  file  output stream
String destFile = "test.txt";
FileOutputStream fos   = new FileOutputStream(destFile);

當寫入檔案時,如果檔案不存在,Java會嘗試建立檔案。但必須要處理這個異常,將程式碼放在try-catch塊中,如下所示:

try  {
    FileOutputStream fos   = new FileOutputStream(srcFile);
}catch  (FileNotFoundException e){
    // Error handling code  goes  here
}

如果檔案包含資料,資料將被擦除。 為了保留現有資料並將新資料追加到檔案,需要使用FileOutputStream類的另一個建構函式,它接受一個布林標誌,用於將新資料附加到檔案。
要將資料追加到檔案,請在第二個引數中傳遞true,使用以下程式碼。

FileOutputStream fos   = new FileOutputStream(destFile, true);

寫入資料

FileOutputStream類有一個過載的write()方法將資料寫入檔案。可以使用不同版本的方法一次寫入一個位元組或多個位元組。

通常,使用FileOutputStream寫入二進位制資料。要向輸出流中寫入諸如「Hello」的字串,請將字串轉換為位元組。
String類有一個getBytes()方法,該方法返回表示字串的位元組陣列。使用FileOutputStream寫一個字串如下:

String destFile = "test.txt";
FileOutputStream fos   = new FileOutputStream(destFile, true);
String text = "Hello";
byte[] textBytes = text.getBytes();
fos.write(textBytes);

要插入一個新行,使用line.separator系統變數如下。

String lineSeparator = System.getProperty("line.separator");
fos.write(lineSeparator.getBytes());

需要使用flush()方法重新整理輸出流。

fos.flush();

重新整理輸出流指示任何寫入的位元組緩衝清出,將資料可以寫入目標處。關閉輸出流類似於關閉輸入流。需要使用close()方法關閉輸出流。

// Close  the   output  stream 
fos.close();

close()方法可能丟擲一個IOException異常。如果希望自動關閉,請使用try-with-resources建立輸出流。

以下程式碼顯示如何將位元組寫入到檔案輸出流。

import java.io.File;
import java.io.FileOutputStream;

public class Main {
  public static void main(String[] args) {
    String destFile = "destfile.txt";

    // Get the line separator for the current platform
    String lineSeparator = System.getProperty("line.separator");

    String line1 = "test";
    String line2 = "test1";

    String line3 = "test2";
    String line4 = "test3";

    try (FileOutputStream fos = new FileOutputStream(destFile)) {
      fos.write(line1.getBytes()); 
      fos.write(lineSeparator.getBytes());

      fos.write(line2.getBytes());
      fos.write(lineSeparator.getBytes());

      fos.write(line3.getBytes());
      fos.write(lineSeparator.getBytes());

      fos.write(line4.getBytes());

      // Flush the written bytes to the file 
      fos.flush();

      System.out.println("Text has  been  written to "
          + (new File(destFile)).getAbsolutePath());
    } catch (Exception e2) {
      e2.printStackTrace();
    }
  }
}

上面的程式碼生成以下結果。

Text has  been  written to F:\website\yiibai\worksp\destfile.txt

F:\website\yiibai\worksp\destfile.txt 檔案的內容如下: