Java FileWriter示例

Java FileWriter

  • Java FileWriter 類是 java.io 包的一部分。
  • FileWriter 是 java.io.OutputStreamWriter 類的子類。
  • FileWriter 用於寫入字符流。
  • FileWriter 用於向字符文件寫入。其 write() 方法允許將字符或字符串寫入文件。
  • 通常將 FileWriter 對象包裝在更高級別的 Writer 對象中,例如 BufferedWriterPrintWriter,這些對象提供更好的性能和更高級別、更靈活的方法來寫入數據。

FileWriter 構造函數

  1. FileWriter(File file): 使用指定的 File 對象創建一個 FileWriter 對象。如果文件存在但是一個目錄而不是普通文件,或者文件不存在但無法創建,或者由於任何其他原因無法打開,則會拋出 IOException
  2. FileWriter(File file, boolean append): 使用指定的File對象創建一個FileWriter對象。如果第二個參數為true,則將字節寫入文件的末尾而不是開頭。如果文件存在但是目錄而不是常規文件,或者文件不存在但無法創建,或者無法因任何其他原因而打開,則會拋出IOException
  3. FileWriter(FileDescriptor fd): 創建與指定文件描述符關聯的FileWriter對象。
  4. FileWriter(String fileName): 使用指定的fileName創建一個FileWriter對象。如果指定的文件存在但是目錄而不是常規文件,或者文件不存在但無法創建,或者無法因任何其他原因而打開,則會拋出一個IOException
  5. FileWriter(String fileName, boolean append): 使用指定的fileName創建一個FileWriter對象,並使用布爾值指示是否附加寫入的數據。如果第二個參數為true,則數據將寫入文件的末尾而不是開頭。如果指定的文件存在但是目錄而不是常規文件,或者文件不存在但無法創建,或者無法因任何其他原因而打開,則會拋出一個IOException。

Java FileWriter示例

FileWriter 繼承了 java.io.OutputStreamWriterjava.io.Writer 類別的方法。讓我們來看一下下面的方法及其示例。

write(int c)

該方法寫入由 int c 指定的單個字符。

package com.journaldev.io.filewriter;

import java.io.FileWriter;
import java.io.IOException;

/**
 * Java write file using FileWriter write method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteIntExample {

	public static void main(String[] args) {
		FileWriter fileWriter = null;
		try {
			fileWriter = new FileWriter("D:/data/file.txt");
			//從 java.io.OutputStreamWriter 繼承的方法 
			fileWriter.write(65);
			fileWriter.write(66);
			fileWriter.write(67);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if (fileWriter != null) {
					fileWriter.flush();
					fileWriter.close();					
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

FileWriter 實現了 AutoCloseable 接口,因此我們可以在使用 FileWriter 類時使用 try with resources

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write method using try with resource
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteIntTryWithResource {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			//從 java.io.OutputStreamWriter 繼承的方法 
			fileWriter.write(65);
			fileWriter.write(66);
			fileWriter.write(67);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

注意: 在上面的程序中 fileWriter.write(65) 會將 A 寫入文件,因為 65 是字符 A 的十進制值,因此整數 65 將轉換為字符 A,其他情況類似。

write(String str, int off, int len)

該方法從字符串 str 的偏移量 off 到偏移量 len 寫入一部分。

  • str: 要寫入的字符串
  • off: 開始讀取字符的偏移量
  • len:要寫入的字元數

如果 len 參數的值為負,則不會寫入任何字元。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(String  s,  int  off,  int  len) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteStringExample {

	public static void main(String[] args) {
		String data = "This is FileWriter Example.";
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// 繼承自 java.io.OutputStreamWriter 
			fileWriter.write(data, 8, 10);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

write(char[] cbuf, int off, int len)

此方法會寫入由 char[] cbuf 指定的字元陣列的一部分,從 int off 到 int len

  • cbuf:字元陣列
  • off:開始讀取字元的偏移量
  • len:要寫入的字元數
package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(char[] cbuf,  int  off,  int  len) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteCharArray {

	public static void main(String[] args) {
		char[] data = "This is FileWriter Example.".toCharArray();
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// 繼承自 java.io.OutputStreamWriter 
			fileWriter.write(data, 8, 10);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

write(char[] cbuf)

此方法會寫入由 cbuf 指定的字元陣列。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(char[] cbuf) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteCharArrayExample {

	public static void main(String[] args) {
		char[] data = "This is FileWriter Example.".toCharArray();
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// 繼承自 java.io.Writer 
			fileWriter.write(data);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

write(String str)

此方法會將字串值寫入指定的檔案,由 str 指定。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter write(String  str) method
 * 
 * @author pankaj
 *
 */
public class FileWriterWriteString {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// 繼承自 java.io.Writer 
			fileWriter.write("JournalDev");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

append(char c)

此方法將指定的字符附加到此寫入器,其中c是要附加的16位字符。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file using FileWriter append(char c) method
 * 
 * @author pankaj
 *
 */
public class FileWriterAppendCharacter {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// 從 java.io.Writer 繼承的方法 
			fileWriter.write("JournalDev");
			fileWriter.append('C');
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

flush()

此方法刷新流。當調用 flush() 方法時,它立即將數據寫入輸出文件。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file with FileWriter flush() method
 * 
 * @author pankaj
 *
 */
public class FileWriterFlushExample {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// 從 java.io.Writer 繼承的方法 
			fileWriter.write("JournalDev");
			// 從 java.io.OutputStreamWriter 繼承的方法
			fileWriter.flush();
			
			fileWriter.write(" Tutorials");
			fileWriter.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

close()

此方法在關閉流之前刷新流。一旦流被關閉,調用 write()flush() 方法將引發 IOException。對已經關閉的流進行關閉操作不起作用。

package com.journaldev.io.filewriter;

import java.io.FileWriter;

/**
 * Java write file with FileWriter close() method
 * 
 * @author pankaj
 *
 */
public class FileWriterCloseExample {

	public static void main(String[] args) {
		try(FileWriter fileWriter = new FileWriter("D:/data/file.txt")) {
			// 從 java.io.Writer 繼承的方法 
			fileWriter.write("JournalDev");
			// 從 java.io.OutputStreamWriter 繼承的方法
			fileWriter.close();;
			
			fileWriter.write(" Tutorials");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

輸出:

java.io.IOException: Stream closed
	at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source)
	at sun.nio.cs.StreamEncoder.write(Unknown Source)
	at sun.nio.cs.StreamEncoder.write(Unknown Source)
	at java.io.OutputStreamWriter.write(Unknown Source)
	at java.io.Writer.write(Unknown Source)
	at com.journaldev.examples.FileWriterCloseExample.main(FileWriterCloseExample.java:20)

FileWriter vs FileOutputStream

  • FileWriter 用于写入字符流,而 FileOutputStream 用于写入原始字节流。
  • FileWriter 处理 16 位字符,而 FileOutputStream 处理 8 位字节。
  • FileWriter 可处理 Unicode 字符串,而 FileOutputStream 向文件写入字节,不接受字符或字符串,因此需要由 OutputStreamWriter 包装以接受字符串。

还可以查看 java write file 了解有关在 Java 中如何写文件的更多信息。关于 Java FileWriter,希望没有漏掉重要内容。

您可以从我们的 GitHub 存储库 下载所有示例代码。

参考:API 文档

Source:
https://www.digitalocean.com/community/tutorials/java-filewriter-example