因此,我们有使用 BufferedWriter 写入服务器上的文件的操作。在刷新 BufferedWriter 之前,我想将内容上传到 S3 存储桶。目前(并且不恰当地)我正在收集 BufferedWriter 使用 StringBuilder 写入的每个字符串(每次追加),但这是一个巨大的字符串(~150mb)。因此,最好直接写入 BufferedWriter 中存储的内容。我一直在互联网上搜索,但我找不到这个问题的明确答案。
这可能并且只需要很少的代码吗?
A
BufferedWriter
只不过是其他 Writer
的包装。因此,这取决于传递给其构造函数的 Writer
的类型。
支持回读功能的
Writer
类型包括 CharArrayWriter
和 StringWriter
,它们分别允许您以 char[]
和 String
的形式阅读内容。
是否可以将
的内容获取为BufferedWriter
?String
不,这是不可能的。
BufferedWriter
仅保存已写入的“一个缓冲区已满”的数据。这不足以满足您的需要。其余数据将被写入文件,并且在内存中将不再可用。 (此外,编写器的缓冲区故意隐藏在抽象层后面,如果不进行“讨厌的”反射,您就无法获取它。)
现在,您可以向输出堆栈添加一个或多个额外组件以捕获内存中的输出。例如,您可以使用 Apache
TeeOutputStream
类 (javadoc) 拆分数据并将第二个副本写入 ByteArrayOutputStream
。或者您可以将第二个副本直接写入 S3 输出流。
另一种方法是将要写入的数据“下沉”到
ByteArrayOutputStream
中,提取字节数组并将其写入文件一次,然后第二次写入到 S3 存储桶的流中。
如果文件可能很大,您最好避免任何需要将整个文件内容保存在内存中的事情。
您正在使用 BufferedWriter 作为缓存,缓存整个流,然后将其写入两个地方。
我使用的是一个
MemFile
类,它在内存中存储流比 StringBuilder 或 ByteArrayOutputStream 更有效,因为它不必在单个连续块中分配内存。
存在这些方法:
java.io.Reader getReader();
java.io.Writer getWriter();
void outToWriter(java.io.Writer w);
实例化该类,获取一个 Writer,向其写入。内容填满后,使用 outToWriter 首先将数据流式传输到 S3,然后使用另一个 Writer 将数据流式传输到文件。或者使用阅读器(如果这样更方便)。
问题提到了面向字符的 Writer,但如果您真的想使用字节,也可以使用字节流方法。
这个类是开源的,但在这里提及它被认为是自我推销,所以它已被删除。