【问题标题】:Is it possible to get the contents of a BufferedWriter as a String?是否可以将 BufferedWriter 的内容作为字符串获取?
【发布时间】:2018-11-26 22:34:27
【问题描述】:

所以,我有一些操作正在使用 BufferedWriter 写入服务器上的文件。在刷新 BufferedWriter 之前,我想将内容上传到 S3 存储桶。目前(并且不恰当地)我正在收集 BufferedWriter 正在使用 StringBuilder 编写的每个字符串(每次都附加),但这是一个巨大的字符串(~150mb)。所以最好直接写存储在 BufferedWriter 中的内容。我一直在搜索互联网和SO,但我找不到这个问题的明确答案。

这是否可能并且只需要很少的代码?

【问题讨论】:

  • 你为什么不同时写入文件 S3
  • 您可以将BufferedWriter 包裹在StringWriter 周围。
  • 不幸的是,文件被顺序写入服务器位置,由于 S3 不允许您附加到对象,我必须等到文件完全写入后再上传到 S3。
  • 使用 FilterWriter。实现'write'方法来做你想做的事,然后调用相应的'out.write'方法。
  • 为什么要在 BufferedWriter 完成它的工作之前(即关闭 writer 之前)上传内容?

标签: java string amazon-s3 bufferedwriter


【解决方案1】:

BufferedWriter 只不过是其他一些Writer 的包装。所以这将取决于将什么类型的Writer 传递到它的构造函数中。

支持回读功能的Writer 类型包括CharArrayWriterStringWriter,它们分别允许您以char[]String 的形式读取内容。

【讨论】:

    【解决方案2】:

    是否可以将BufferedWriter 的内容作为String 获取?

    不,这是不可能的。

    BufferedWriter 仅保存已写入数据的“一个缓冲区已满”。这不足以满足您的需求。其余数据将已写入文件,并且将不再在内存中可用。 (此外,作者的缓冲区被故意隐藏在一个抽象层后面,你无法做到这一点......不进行“讨厌”的反射。)

    现在,您可以向输出堆栈添加一个或多个额外组件,以捕获内存中的输出。例如,您可以使用 Apache TeeOutputStream 类 (javadoc) 拆分数据并将第二份副本写入 ByteArrayOutputStream。或者您可以将第二个副本直接写入 S3 输出流。

    另一种方法是将要写入的数据“接收”到ByteArrayOutputStream,提取字节数组并将其一次写入文件,第二次写入流到 S3 存储桶。

    如果文件可能很大,最好避免将整个文件内容保存在内存中的任何事情。

    【讨论】:

      【解决方案3】:

      您正在使用 BufferedWriter 作为缓存,缓存整个流,然后将其写入两个位置。

      我使用的是 MemFile 类,它比 StringBuilder 或 ByteArrayOutputStream 更有效地将流存储在内存中,因为它不必在单个连续块中分配内存。

      该课程可在以下位置获得开源:https://github.com/agilepro/mendocino/blob/master/src/com/purplehillsbooks/streams/MemFile.java

      这些方法存在:

      java.io.Reader  getReader();
      java.io.Writer  getWriter();
      void            outToWriter(java.io.Writer w);
      

      实例化该类,获取一个 Writer,写入它。一旦它充满了内容,使用 outToWriter 首先流到 S3,然后使用另一个 Writer 流到文件。或者如果这样更方便,请使用阅读器。

      问题提到了面向字符的写入器,但如果你真的想使用字节,也有字节流方法。

      文档位于:http://purplehillsbooks.com/purpleDoc/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多