Java FileWriter 教程:文件写入与操作详解
Java的FileWriter
- Java FileWriter 类是 `java.io` 包的一部分。
 - FileWriter 是 `java.io.OutputStreamWriter` 类的子类。
 - FileWriter 用于写入字符流。
 - FileWriter 用于向字符文件写入数据。其 `write()` 方法允许您将一个或多个字符或字符串写入文件。
 - FileWriter 通常会被更高级别的 Writer 对象(如 BufferedWriter 或 PrintWriter)包装,这些对象提供了更好的性能和更高级、更灵活的数据写入方法。
 
FileWriter 构造函数
- `FileWriter(File file)`: 使用指定的 `File` 对象创建一个 `FileWriter` 对象。如果文件存在但它是一个目录而不是一个普通文件,或者文件不存在但无法创建,或者无法以任何其他原因打开文件,则抛出一个 `IOException`。
 - `FileWriter(File file, boolean append)`: 使用指定的 `File` 对象创建一个 `FileWriter` 对象。如果第二个参数为 `true`,则会将字节写入文件的末尾而不是开头。如果文件存在但它是一个目录而不是一个普通文件,或者文件不存在但无法创建,或者无法以任何其他原因打开文件,则抛出一个 `IOException`。
 - `FileWriter(FileDescriptor fd)`: 创建一个与指定文件描述符关联的 `FileWriter` 对象。
 - `FileWriter(String fileName)`: 使用指定的文件名创建一个 `FileWriter` 对象。如果文件存在但它是一个目录而不是一个普通文件,或者文件不存在但无法创建,或者无法以任何其他原因打开文件,则抛出一个 `IOException`。
 - `FileWriter(String fileName, boolean append)`: 使用指定的文件名创建一个 `FileWriter` 对象,并使用一个布尔值指示是否追加写入的数据。如果第二个参数为 `true`,则数据将被写入文件的末尾而不是开头。如果文件存在但它是一个目录而不是一个普通文件,或者文件不存在但无法创建,或者无法以任何其他原因打开文件,则抛出一个 `IOException`。
 
Java FileWriter 示例
Java FileWriter 示例展示了如何使用 FileWriter 类进行文件写入。
FileWriter 继承了 `java.io.OutputStreamWriter` 和 `java.io.Writer` 类的方法。我们来看一下下面的一些方法和示例。
写入 `int c`
这个方法写入一个由整数 `c` 指定的单个字符。
package com.Olivia.io.filewriter;
import java.io.FileWriter;
import java.io.IOException;
/**
 * Java 使用 FileWriter 的 write 方法写入文件
 *
 * @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();
			}
		}
	}
}
package com.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * Java 使用 try-with-resources 语句通过 FileWriter 的 write 方法写入文件
 *
 * @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’ 的十进制 ASCII 值,所以整数 65 会被转换成字符 ‘A’,其他字符同理。
写入 `String str, int off, int len`
这种方法从字符串 `str` 的 `off` 偏移量开始,将长度为 `len` 的一部分字符写入文件。
- `str`: 要写入的字符串
 - `off`: 开始读取字符的偏移量
 - `len`: 要写入的字符数量
 
如果 `len` 参数的值为负数,则不会写入任何字符。
package com.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * Java 使用 FileWriter 的 write(String s, int off, int len) 方法写入文件
 *
 * @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();
		}
	}
}
将字符数组 `cbuf` 从 `off` 位置开始的长度为 `len` 的部分写入。
该方法将字符数组 `char[] cbuf` 中从 `off` 位置开始,长度为 `len` 的一部分写入。
cbuf: 一个字符数组off: 开始读取字符的偏移量len: 要写入的字符数量
package com.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * 使用 FileWriter 的 write(char[] cbuf, int off, int len) 方法在 Java 中写入文件
 *
 * @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();
		}
	}
}
写入字符数组 cbuf
此方法将由 cbuf 指定的字符数组写入文件。
package com.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * 使用 FileWriter 的 write(char[] cbuf) 方法在 Java 中写入文件
 *
 * @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();
		}
	}
}
写入字符串 str
此方法将一个字符串值写入由 str 指定的文件中。
package com.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * 使用 FileWriter 的 write(String str) 方法在 Java 中写入文件
 *
 * @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();
		}
	}
}
追加字符 c
将指定字符追加到此写入器中,其中 c 是要追加的 16 位字符。
package com.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * 使用 FileWriter 的 append(char c) 方法在 Java 中写入文件
 *
 * @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.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * 使用 FileWriter 的 flush() 方法在 Java 中写入文件
 *
 * @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.Olivia.io.filewriter;
import java.io.FileWriter;
/**
 * 使用 FileWriter 的 close() 方法在 Java 中写入文件
 *
 * @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.Olivia.examples.FileWriterCloseExample.main(FileWriterCloseExample.java:20)
FileWriter 和 FileOutputStream 的比较
FileWriter用于写入字符流,而FileOutputStream用于写入原始字节流。FileWriter处理 16 位字符,而FileOutputStream处理 8 位字节。FileWriter可以处理 Unicode 字符串,而FileOutputStream将字节写入文件,不接受字符或字符串,因此需要通过OutputStreamWriter进行包装才能接受字符串。
您还可以查阅 Java 写入文件 的相关内容,了解如何在 Java 中写入文件。以上就是关于 Java FileWriter 的全部内容,希望没有遗漏任何重要信息。
您可以从我们的 GitHub 仓库下载所有示例代码。
参考: API 文档