因此,我有一些操作是使用BufferedWriter写入服务器上的文件的。在刷新BufferedWriter之前,我想将内容上传到S3存储桶。当前(并且不恰当地),我正在使用StringBuilder(每次追加)来收集BufferedWriter正在写入的每个字符串,但这是一个巨大的字符串(〜150mb)。因此,最好直接写直接存储在BufferedWriter中的内容。我一直在搜寻Internet和SO,但是找不到这个问题的明确答案。
有可能并且只需很少的代码吗?
答案 0 :(得分:2)
是否可以将
BufferedWriter
的内容作为String
获得?
不可以。
BufferedWriter
仅保留已写入数据的“一个缓冲区已满”。这不足以满足您的需求。其余数据将被写入文件,并且不再在内存中可用。 (此外,编写者的缓冲区被故意隐藏在抽象层的后面,这样做是您无法做到的……不进行“讨厌的”反射。)
现在,您可以在输出堆栈中添加一个或多个额外的组件,以捕获内存中的输出。例如,您可以使用Apache TeeOutputStream
类(javadoc)分割数据并将第二个副本写入ByteArrayOutputStream
。或者,您也可以将第二个副本直接写入S3输出流。
另一种方法是将要写入的数据“下沉”到ByteArrayOutputStream
中,提取字节数组,然后一次将其写入文件,第二次将其写入S3存储桶。
如果文件可能很大,最好避免使用任何将整个文件内容保存在内存中的方法。
答案 1 :(得分:1)
BufferedWriter
只不过是其他Writer
周围的包装器。因此,这取决于将Writer
的类型传递给其构造函数。
支持回读功能的Writer
类型包括CharArrayWriter
和StringWriter
,它们使您可以将内容读为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是面向字符的,但是如果您真的想使用字节,那么还有字节流方法。