【发布时间】:2009-11-19 03:18:53
【问题描述】:
我有一个函数,它接受一个特定类型的对象,以及一个要打印到的PrintStream,并输出该对象的表示。如何在字符串中捕获此函数的输出?具体来说,我想在toString 方法中使用它。
【问题讨论】:
标签: java string printstream
我有一个函数,它接受一个特定类型的对象,以及一个要打印到的PrintStream,并输出该对象的表示。如何在字符串中捕获此函数的输出?具体来说,我想在toString 方法中使用它。
【问题讨论】:
标签: java string printstream
使用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);
【讨论】:
new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);,它不会抛出
ByteArrayOutputStream.close() "没有效果",因为除了将要处理的支持数组之外没有可以释放的资源由垃圾收集器。
ByteArrayOutputStream 有toString(String charsetName),但只接受字符串参数。另请注意,ByteArrayOutputStream 是同步的,这可能是不可取的
您可以构造一个 PrintStream,并将 ByteArrayOutputStream 传递给构造函数,以后可以使用它来获取写入 PrintStream 的文本。
ByteArrayOutputStream os = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(os);
...
String output = os.toString("UTF8");
【讨论】:
为什么不将 StringWriter 与 PrintWriter 一起使用?
StringWriter writer = new StringWriter();
PrintWriter out = new PrintWriter(writer);
out.println("Hello World!");
String output = writer.toString();
【讨论】:
以前答案的统一,此答案适用于 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();
【讨论】:
也许这个问题可以帮助你: Get an OutputStream into a String
子类 OutputStream 并将其包装在 PrintStream 中
【讨论】:
定义并初始化一个名为 inSS 的 Scanner 变量,该变量使用字符串变量 myStrLine 创建一个输入字符串流。
回答: 扫描仪 inSS = new Scanner(myStrLine);
【讨论】: