ZetCode

Java CharArrayWriter 类

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

java.io.CharArrayWriter 类实现了一个可以用作 Writer 的字符缓冲区。随着数据写入,缓冲区会自动增长。可以使用 toCharArray() 和 toString() 方法检索数据。

当您需要将字符写入内存而不是文件或网络时,CharArrayWriter 非常有用。 它提供了将写入的数据作为字符数组或字符串访问的方法。该类在内部处理所有字符编码。

CharArrayWriter 类概述

CharArrayWriter 扩展了 Writer 并提供了内存中的字符缓冲区操作。 关键方法包括写入操作、缓冲区大小管理和数据检索。 缓冲区会根据需要自动扩展。

public class CharArrayWriter extends Writer {
    public CharArrayWriter();
    public CharArrayWriter(int initialSize);
    public void write(int c);
    public void write(char[] c, int off, int len);
    public void write(String str, int off, int len);
    public void writeTo(Writer out);
    public void append(CharSequence csq);
    public void append(CharSequence csq, int start, int end);
    public void append(char c);
    public void reset();
    public char[] toCharArray();
    public int size();
    public String toString();
    public void flush();
    public void close();
}

上面的代码显示了 CharArrayWriter 提供的关键方法。 这些方法允许将字符写入内存缓冲区并检索它们。 该类对于测试或需要捕获输出时特别有用。

创建 CharArrayWriter

可以使用默认初始大小或自定义大小创建 CharArrayWriter。 缓冲区会根据需要自动增长。 默认构造函数创建一个具有 32 个字符初始容量的缓冲区。

Main.java
import java.io.CharArrayWriter;

public class Main {

    public static void main(String[] args) {
        // Create with default size
        CharArrayWriter writer1 = new CharArrayWriter();
        
        // Create with custom initial size
        CharArrayWriter writer2 = new CharArrayWriter(1024);
        
        System.out.println("Default size writer created");
        System.out.println("Custom size (1024) writer created");
        
        // Write some data
        writer1.write("Hello");
        writer2.write("World");
        
        System.out.println("Writer1 content: " + writer1.toString());
        System.out.println("Writer2 content: " + writer2.toString());
        
        writer1.close();
        writer2.close();
    }
}

此示例演示了创建 CharArrayWriter 的不同方法。 第一个使用默认大小,而第二个指定 1024 个字符。 数据被写入两个 writer,然后作为字符串检索。 完成后始终关闭 writer。

将数据写入 CharArrayWriter

CharArrayWriter 为不同的数据类型提供了多种写入方法。 您可以写入单个字符、字符数组、字符串或其中的一部分。 所有数据都将附加到内部缓冲区。

Main.java
import java.io.CharArrayWriter;

public class Main {

    public static void main(String[] args) {
        try (CharArrayWriter writer = new CharArrayWriter()) {
            
            // Write single character
            writer.write('A');
            
            // Write character array
            char[] chars = {'B', 'C', 'D'};
            writer.write(chars);
            
            // Write portion of character array
            writer.write(chars, 1, 2);
            
            // Write string
            writer.write("EFG");
            
            // Write portion of string
            writer.write("HIJKLM", 2, 3);
            
            System.out.println("Writer content: " + writer.toString());
        }
    }
}

此示例显示了 CharArrayWriter 支持的各种写入操作。 输出组合了所有写入的数据:“A”+“BCD”+“CD”+“EFG”+“JKL”。 try-with-resources 确保正确清理。 缓冲区会根据需要自动增长。

从 CharArrayWriter 检索数据

可以从 CharArrayWriter 中检索数据作为字符数组或字符串。 toCharArray() 方法返回缓冲区内容的副本。 toString() 方法将缓冲区转换为字符串。

Main.java
import java.io.CharArrayWriter;

public class Main {

    public static void main(String[] args) {
        CharArrayWriter writer = new CharArrayWriter();
        
        writer.write("Lorem ipsum dolor sit amet");
        
        // Get as character array
        char[] charArray = writer.toCharArray();
        System.out.println("Character array length: " + charArray.length);
        System.out.println("First character: " + charArray[0]);
        
        // Get as string
        String content = writer.toString();
        System.out.println("String content: " + content);
        
        // Get size
        System.out.println("Buffer size: " + writer.size());
        
        writer.close();
    }
}

此示例演示了从 CharArrayWriter 检索数据。 toCharArray() 方法返回一个新的字符数组副本。 toString() 方法从缓冲区创建一个字符串。 size() 方法返回缓冲区中当前字符的数量。

写入另一个 Writer

writeTo() 方法将缓冲区内容写入另一个 Writer。 这对于将收集的数据传输到另一个输出目的地非常有用。 该方法写入整个缓冲区内容。

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

public class Main {

    public static void main(String[] args) {
        CharArrayWriter writer = new CharArrayWriter();
        writer.write("This text will be written to a file");
        
        try (FileWriter fileWriter = new FileWriter("output.txt")) {
            // Write buffer contents to file
            writer.writeTo(fileWriter);
            System.out.println("Data written to file successfully");
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        writer.close();
    }
}

此示例显示了如何将数据从 CharArrayWriter 传输到 FileWriter。 writeTo() 方法将所有收集到的字符写入指定的 Writer。 当您需要在将输出写入最终目的地之前缓冲输出时,此模式非常有用。

重置缓冲区

reset() 方法清除缓冲区内容,同时保持底层缓冲区已分配。 当您需要重用缓冲区时,这比创建新的 CharArrayWriter 更有效。 缓冲区容量保持不变。

Main.java
import java.io.CharArrayWriter;

public class Main {

    public static void main(String[] args) {
        CharArrayWriter writer = new CharArrayWriter();
        
        // First usage
        writer.write("First content");
        System.out.println("First content: " + writer.toString());
        System.out.println("Size after first write: " + writer.size());
        
        // Reset buffer
        writer.reset();
        System.out.println("Size after reset: " + writer.size());
        
        // Second usage
        writer.write("New content");
        System.out.println("Second content: " + writer.toString());
        System.out.println("Size after second write: " + writer.size());
        
        writer.close();
    }
}

此示例演示了如何使用 reset() 来重用 CharArrayWriter。 在写入数据并调用 reset() 之后,缓冲区为空,但保持其容量。 在处理多个项目时,这比创建新实例更有效。

追加数据

CharArrayWriter 实现了 Appendable,允许使用 append() 方法追加数据。 这些方法的工作方式与 write() 类似,但返回 CharArrayWriter 以进行方法链接。 它们接受字符、CharSequence 或 CharSequence 的一部分。

Main.java
import java.io.CharArrayWriter;

public class Main {

    public static void main(String[] args) {
        CharArrayWriter writer = new CharArrayWriter();
        
        // Append various data types
        writer.append('A')
              .append("BC")
              .append("DEF", 1, 3)
              .append('G');
        
        System.out.println("Appended content: " + writer.toString());
        
        // Append with StringBuilder
        StringBuilder sb = new StringBuilder("HIJ");
        writer.append(sb);
        
        System.out.println("After StringBuilder append: " + writer.toString());
        
        writer.close();
    }
}

此示例显示了如何使用 append() 方法进行流畅的写入。 这些方法返回 CharArrayWriter 实例,允许方法链接。 输出为“ABCDEFGHIJ”。 追加操作对于通过链接调用构建复杂输出非常方便。

来源

Java CharArrayWriter 类文档

在本文中,我们介绍了 Java CharArrayWriter 类的基本方法和功能。 理解这些概念对于在 Java 应用程序中使用内存中的字符缓冲区至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的敬业程序员。我从 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和八本电子书。拥有超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程