Java:PrintStream到String?

Nic*_*ner 110 java string printstream

我有一个函数,它接受某种类型的对象,以及PrintStream要打印的对象,并输出该对象的表示.如何在String中捕获此函数的输出?具体来说,我想在toString方法中使用它.

Chs*_*y76 184

使用a ByteArrayOutputStream作为缓冲区:

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.nio.charset.StandardCharsets;

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (PrintStream ps = new PrintStream(baos, true, "UTF-8")) {
        yourFunction(object, ps);
    }
    String data = new String(baos.toByteArray(), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记关闭PrintStream以释放所有资源. (10认同)
  • 我建议使用`PrintStream ps = new PrintStream(baos,true,"utf-8");`以避免charset混乱 (9认同)
  • 使用`new String(baos.toByteArray(),java.nio.charset.StandardCharsets.UTF_8);`从**1.7**开始,它不会抛出 (4认同)
  • 想通过任何机会降低变量名`S`的条件吗?你伤害了我的眼睛. (3认同)
  • @Asaph - 随意避免他们:-) (2认同)
  • @tobr肯定是一个很好的经验法则,但是[`ByteArrayOutputStream.close()`](https://docs.oracle.com/javase/8/docs/api/java/io/ByteArrayOutputStream.html#close--) "*没有效果*",因为除了将由垃圾收集器处理的后备阵列之外没有可用的资源. (2认同)

Asa*_*aph 30

您可以使用传递给构造函数的ByteArrayOutputStream构造一个PrintStream,稍后您可以使用它来获取写入PrintStream的文本.

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");
Run Code Online (Sandbox Code Playgroud)


Cle*_*nic 8

为什么不将 StringWriter 与 PrintWriter 一起使用?

StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
out.println("Hello World!");
String output = writer.toString();
Run Code Online (Sandbox Code Playgroud)

  • 这行不通。您不能将 PrintWriter 传递给仅将 PrintStream 作为参数的函数,这就是问题所在。 (6认同)

Kae*_*tar 5

与以前的答案统一,此答案适用于Java 1.7及更高版本。另外,我添加了代码以关闭Streams。

final Charset charset = StandardCharsets.UTF_8;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true, charset.name());
yourFunction(object, ps);
String content = new String(baos.toByteArray(), charset);
ps.close();
baos.close();
Run Code Online (Sandbox Code Playgroud)