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 文档