ZetCode

Java Writer 类

最后修改时间:2025 年 4 月 16 日

java.io.Writer 类是一个用于写入字符流的抽象类。 它是所有字符输出流类的超类。 该类提供了用于写入单个字符、字符数组和字符串的方法。

Writer 实现了 AutoCloseableFlushableAppendable 接口。 子类必须实现 write、flush 和 close 方法。 Writers 可以被缓冲以获得更好的性能。

Writer 类概述

Writer 提供了用于字符输出操作的基本方法。 关键方法包括各种写入操作、刷新和关闭流。 该类在内部处理字符编码转换。

public abstract class Writer implements Appendable, Closeable, Flushable {
    protected Object lock;
    protected Writer();
    protected Writer(Object lock);
    public void write(int c);
    public void write(char[] cbuf);
    public abstract void write(char[] cbuf, int off, int len);
    public void write(String str);
    public void write(String str, int off, int len);
    public Writer append(CharSequence csq);
    public Writer append(CharSequence csq, int start, int end);
    public Writer append(char c);
    public abstract void flush();
    public abstract void close();
}

上面的代码显示了 Writer 提供的关键方法。 这些方法允许将字符数据写入各种目的地。 该类使用同步来保证线程安全,使用显式的锁对象或 Writer 实例本身。

创建 FileWriter

FileWriter 是一个常用的 Writer 子类,用于写入字符文件。 它使用默认的字符编码和缓冲区大小。 为了获得更多控制,可以使用 OutputStreamWriter 包装 FileOutputStream

Main.java
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Main {

    public static void main(String[] args) {
        try {
            // Create FileWriter with default settings
            Writer writer1 = new FileWriter("output1.txt");
            
            // Create FileWriter with append mode
            Writer writer2 = new FileWriter("output2.txt", true);
            
            // Write some data
            writer1.write("Hello, FileWriter!");
            writer2.append("\nAppended line");
            
            System.out.println("Files written successfully");
            
            // Close writers
            writer1.close();
            writer2.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了创建 FileWriter 实例。 第一个覆盖现有文件,第二个附加到它们。 始终关闭 writers 以确保数据被刷新并释放资源。 append 方法提供了一个流畅的接口。

写入字符和字符串

Writer 提供了多种用于写入字符数据的方法。 您可以写入单个字符、字符数组或字符串。 通过偏移量和长度参数支持部分写入。

Main.java
import java.io.StringWriter;
import java.io.Writer;

public class Main {

    public static void main(String[] args) {
        try (Writer writer = new StringWriter()) {
            // Write single character
            writer.write('J');
            
            // Write character array
            char[] chars = {'a', 'v', 'a'};
            writer.write(chars);
            
            // Write partial character array
            writer.write(chars, 1, 2);
            
            // Write string
            writer.write(" Programming");
            
            // Write partial string
            writer.write(" is fun!", 3, 4);
            
            System.out.println("Result: " + writer.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

此示例显示了使用 StringWriter 的各种写入操作。 输出将所有写入的数据组合成一个字符串。 部分写入演示了选择数组和字符串的一部分。 StringWriter 适用于在内存中构建字符串。

使用 BufferedWriter

BufferedWriter 包装另一个 Writer 以缓冲输出。 这通过减少原生 I/O 操作来提高性能。 默认缓冲区大小为 8192 个字符,但可以自定义。

Main.java
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class Main {

    public static void main(String[] args) {
        try (Writer fileWriter = new FileWriter("buffered.txt");
             BufferedWriter writer = new BufferedWriter(fileWriter)) {
            
            // Write lines with newLine()
            writer.write("First line");
            writer.newLine();
            writer.write("Second line");
            writer.newLine();
            
            // Write multiple characters
            writer.write("Third line with some extra text");
            
            // Flush explicitly (not needed with try-with-resources)
            writer.flush();
            
            System.out.println("Data written to buffered.txt");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了使用 BufferedWriter 进行高效写入。 newLine 方法写入特定于平台的行分隔符。 缓冲区在满或关闭时自动刷新。 显式刷新可确保立即写入数据。

使用 Writer 进行追加

Appendable 接口提供了 append 方法,用于方便地写入。 这些方法返回 Writer 实例,从而实现方法链。 它们可以写入 CharSequence 对象或单个字符。

Main.java
import java.io.StringWriter;
import java.io.Writer;

public class Main {

    public static void main(String[] args) {
        try (Writer writer = new StringWriter()) {
            // Chain append operations
            writer.append("Hello")
                  .append(' ')
                  .append("World")
                  .append("!")
                  .append('\n')
                  .append("Java ")
                  .append("Writer ", 0, 6)
                  .append("example");
            
            System.out.println(writer.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

此示例显示了使用 append 操作进行方法链。 append 方法比 write 更灵活,因为它们接受任何 CharSequence。 通过开始和结束参数支持部分追加。 结果在内存中高效构建。

使用 OutputStreamWriter

OutputStreamWriter 将字节流桥接到字符流。 它使用指定的字符集将字符转换为字节。 当您需要控制输出的字符编码时,这很有用。

Main.java
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

public class Main {

    public static void main(String[] args) {
        try (Writer writer = new OutputStreamWriter(
                new FileOutputStream("encoded.txt"), StandardCharsets.UTF_8)) {
            
            // Write text with specified encoding
            writer.write("UTF-8 encoded text: ");
            writer.write("こんにちは"); // Japanese hello
            writer.write(" привет"); // Russian hello
            writer.write(" 你好"); // Chinese hello
            
            System.out.println("Text written with UTF-8 encoding");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了使用特定字符编码写入文本。 OutputStreamWriter 使用 UTF-8 将字符转换为字节。 这对于正确处理非 ASCII 字符至关重要。 生成的文件将包含正确编码的多语言文本。

来源

Java Writer 类文档

在本文中,我们介绍了 Java Writer 类的基本方法和特性。 理解这些概念对于在 Java 应用程序中使用字符输出操作至关重要。

作者

我的名字是 Jan Bodnar,我是一位经验丰富的程序员,在该领域拥有多年的经验。 我从 2007 年开始撰写编程文章,此后撰写了 1,400 多篇文章和 8 本电子书。 凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程