# Java `FileWriter`教程

原文：http://zetcode.com/java/filewriter/

Java `FileWriter`教程显示了如何使用`FileWriter`类将文本写入 Java 文件。 请注意，`FileWriter`有一个严重的限制：它使用默认编码，并且不允许我们显式指定编码。

## Java `FileWriter`

`FileWriter`是 Java 便利类，用于将文本数据写入文件。 `FileWriter`扩展了`OutputStreamWriter`并创建了`FileOutputStream`。

## Java `FileWriter`构造器

这些是`FileWriter`构造器：

*   `FileWriter(File file)`  — 将`FileWriter`构造为`File`对象。
*   `FileWriter(File file, boolean append)` - 将`FileWriter`对象构造为`File`对象； 允许附加模式。
*   `FileWriter(FileDescriptor fd)` - 将`FileWriter`构造为`FileDescriptor`。
*   `FileWriter(String fileName)` - 将`FileWriter`构造为文件名。
*   `FileWriter(String fileName, boolean append)` - 将`FileWriter`对象构造为文件名； 允许附加模式。

## Java `FileWriter`写入文件

使用`FileInputStream`和`FileOutputStream`，我们创建用于读取和写入`File`的流。 找不到文件时，将引发`FileNotFoundException`。 `File`是 Java 中文件或目录的表示。

`JavaFileWriterEx.java`

```java
package com.zetcode;

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

public class JavaFileWriterEx {

    public static void main(String[] args) throws IOException {

        try (FileWriter writer = new FileWriter("src/resources/myfile.txt")) {
            writer.write("Today is a sunny day");
        }
    }
}

```

该示例使用`FileWriter`将文本数据写入文件。

```java
try (FileWriter writer = new FileWriter("src/resources/myfile.txt")) {

```

`FileWriter`构造器采用字符串作为参数； 它是我们写入的文件名。 完成编写后，我们使用`try-with-resources`构造来清理资源。

```java
writer.write("Today is a sunny day");

```

`FileWriter`的`write()`方法将文本写入文件。

## Java `FileWriter`附加到文件

使用`FileWriter`可以将文本附加到文件中。 附加的典型用法是日志记录。

`JavaFileWritterAppend.java`

```java
package com.zetcode;

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

public class JavaFileWritterAppend {

    public static void main(String[] args) throws IOException {

        String fileName = "src/resources/myfile.txt";
        File myfile = new File(fileName);

        try (FileWriter writer = new FileWriter(myfile, true)) {
            writer.write("Tomorrow will be cloudy.");
        }        
    }
}

```

该代码示例将文本附加到文件。

```java
try (FileWriter writer = new FileWriter(myfile, true)) {

```

`FileWriter`的第二个参数告诉我们将附加到文件中。

## 使用`BufferedWriter`的`FileWriter`

`BufferedWriter`可以提高`FileWriter's`性能。 `BufferedWriter`将文本写入字符输出流，缓冲字符以提高写入单个字符，数组和字符串的性能。 可以指定缓冲区大小，也可以接受默认大小； 默认值对于大多数用途来说足够大。

`JavaFileWriterBuffered.java`

```java
package com.zetcode;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class JavaFileWriterBuffered {

    public static void main(String[] args) throws MalformedURLException, IOException {

        String text = readText();

        String fileName = "src/resources/wikipedia_home_page.txt";

        try (FileWriter writer = new FileWriter(fileName);
                BufferedWriter bufWriter = new BufferedWriter(writer)) {
            bufWriter.write(text);
        }
    }

    public static String readText() throws MalformedURLException, IOException {

        StringBuilder sb;

        URL url = new URL("https://www.wikipedia.org");
        try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {
            String line;

            sb = new StringBuilder();

            while ((line = br.readLine()) != null) {

                sb.append(line);
                sb.append(System.lineSeparator());
            }
        }

        return sb.toString();
    }
}

```

在示例中，我们阅读了维基百科的主页（其 HTML 代码）并将其写入文件。 主页足够大以考虑缓冲。

```java
try (FileWriter writer = new FileWriter(fileName);
        BufferedWriter bufWriter = new BufferedWriter(writer)) {
    bufWriter.write(text);
}

```

`FileWriter`作为参数传递给`BufferedWriter`。 然后，我们调用`BufferedWriter`的`write()`方法来编写文本。

```java
try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()))) {

```

读取操作也通过`BufferedReader`类进行缓冲。

## 指定编码

`FileWriter`使用默认编码，并且不允许我们显式指定编码。 如果必须设置编码，则可以使用`OutputStreamWriter`和`FileOutputStream`。

`JavaFileOutputStreamEx.java`

```java
package com.zetcode;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

public class JavaFileOutputStreamEx {

    public static void main(String[] args) throws FileNotFoundException, IOException {

        String fileName = "src/resources/myfile.txt";

        try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(fileName), 
                StandardCharsets.UTF_8)) {
            osw.write("Сегодня был прекрасный день.");
        }
    }
}

```

该示例使用`OutputStreamWriter`将文本写入文件。 第二个参数是要使用的字符集。

在本教程中，我们介绍了 Java `FileWriter`类。 您可能也对相关教程感兴趣： [Java `FileOutputStream`教程](/java/fileoutputstream/)， [Java 文件时间](/articles/javafiletime/)， [Java 附加到文件](/articles/javaappendtofile/)，[用 Java 读取文本文件](/articles/javareadtext/)，[用 Java 读写 ICO 图像](/articles/javaico/)， [Java Swing 教程](/tutorials/javaswingtutorial/)，[Java 教程](/lang/java/)，[用 Java 显示图像](/java/displayimage/)。