Java:将PrintStream转换为String?


115

我有一个函数,该函数接受某种类型的对象PrintStream并向其打印,并输出该对象的表示。如何在字符串中捕获此函数的输出?具体来说,我想将其用作toString方法。

Answers:


193

使用a ByteArrayOutputStream作为缓冲区:

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

    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    final String utf8 = StandardCharsets.UTF_8.name();
    try (PrintStream ps = new PrintStream(baos, true, utf8)) {
        yourFunction(object, ps);
    }
    String data = baos.toString(utf8);

10
不要忘记关闭PrintStream以释放所有资源。
2012年

9
我会建议使用 PrintStream ps = new PrintStream(baos,true,"utf-8");,以避免字符集的混乱
马克斯Völkel博士

5
使用new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);可自1.7,它不会抛出
earcam

2
@tobr当然是一个很好的经验法则,但是ByteArrayOutputStream.close()没有效果 ”,因为除了将由垃圾收集器处理的后备数组之外,没有其他资源可以释放。
dimo414'6

ByteArrayOutputStream具有toString(String charsetName),但仅接受String参数。另请注意,ByteArrayOutputStream已同步,这可能是不希望的
不要惊慌

31

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

ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");

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();


-3

定义并初始化一个名为inSS的Scanner变量,该变量使用String变量myStrLine创建一个输入字符串流。

答案:Scanner inSS = new Scanner(myStrLine);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.