【问题标题】:Java: PrintStream to String?Java:打印流到字符串?
【发布时间】:2009-11-19 03:18:53
【问题描述】:

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

【问题讨论】:

    标签: java string printstream


    【解决方案1】:

    使用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);
    

    【讨论】:

    • 不要忘记关闭 PrintStream 以释放所有资源。
    • 使用自 1.7 起可用的new String(baos.toByteArray(), java.nio.charset.StandardCharsets.UTF_8);,它不会抛出
    • @tobr 当然是一个很好的经验法则,但是ByteArrayOutputStream.close() "没有效果",因为除了将要处理的支持数组之外没有可以释放的资源由垃圾收集器。
    • ByteArrayOutputStreamtoString(String charsetName),但只接受字符串参数。另请注意,ByteArrayOutputStream 是同步的,这可能是不可取的
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      StringWriter writer = new StringWriter();
      PrintWriter out = new PrintWriter(writer);
      out.println("Hello World!");
      String output = writer.toString();
      

      【讨论】:

      • 除了评分最高的答案之外,这个答案不会用 charsetName 打扰您。
      • 这行不通。您不能将 PrintWriter 传递给仅将 PrintStream 作为参数的函数,这就是问题所在。
      • 我把它作为替换 PrintStream 的建议。这通常是一个不错的选择。如果您必须使用 PrintStream,那么这绝对不是一个选择。 (我不确定为什么有人会对此投票 -1 .. 在大多数情况下,它在技术上仍然是一个可行的选择 :))
      【解决方案4】:

      以前答案的统一,此答案适用于 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();
      

      【讨论】:

        【解决方案5】:

        也许这个问题可以帮助你: Get an OutputStream into a String

        子类 OutputStream 并将其包装在 PrintStream 中

        【讨论】:

          【解决方案6】:

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

          回答: 扫描仪 inSS = new Scanner(myStrLine);

          【讨论】:

            猜你喜欢
            • 2017-08-17
            • 1970-01-01
            • 2019-05-08
            • 2011-09-17
            • 2017-02-10
            • 2012-09-04
            • 1970-01-01
            • 2017-09-24
            • 1970-01-01
            相关资源
            最近更新 更多