是否可以将BufferedWriter的内容作为字符串获取?

时间:2018-11-26 22:34:28

标签: java string amazon-s3 bufferedwriter

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

有可能并且只需很少的代码吗?

3 个答案:

答案 0 :(得分:2)

  

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

不可以。

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

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

另一种方法是将要写入的数据“下沉”到ByteArrayOutputStream中,提取字节数组,然后一次将其写入文件,第二次将其写入S3存储桶。

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

答案 1 :(得分:1)

BufferedWriter只不过是其他Writer周围的包装器。因此,这取决于将Writer的类型传递给其构造函数。

支持回读功能的Writer类型包括CharArrayWriterStringWriter,它们使您可以将内容读为char[]和{{ 1}}。

答案 2 :(得分:0)

您正在使用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流到文件。或者,如果更方便,请使用阅读器。

问题提到了Writer是面向字符的,但是如果您真的想使用字节,那么还有字节流方法。

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