是否可以以字符串形式获取 BufferedWriter 的内容?

问题描述 投票:0回答:3

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

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

java string amazon-s3 bufferedwriter
3个回答
2
投票

A

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

支持回读功能的

Writer
类型包括
CharArrayWriter
StringWriter
,它们分别允许您以
char[]
String
的形式阅读内容。


1
投票

是否可以将

BufferedWriter
的内容获取为
String

不,这是不可能的。

BufferedWriter
仅保存已写入的“一个缓冲区已满”的数据。这不足以满足您的需要。其余数据将被写入文件,并且在内存中将不再可用。 (此外,编写器的缓冲区故意隐藏在抽象层后面,如果不进行“讨厌的”反射,您就无法获取它。)

现在,您可以向输出堆栈添加一个或多个额外组件以捕获内存中的输出。例如,您可以使用 Apache

TeeOutputStream
类 (javadoc) 拆分数据并将第二个副本写入
ByteArrayOutputStream
。或者您可以将第二个副本直接写入 S3 输出流。

另一种方法是将要写入的数据“下沉”到

ByteArrayOutputStream
中,提取字节数组并将其写入文件一次,然后第二次写入到 S3 存储桶的流中。

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


0
投票

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

我使用的是一个

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

存在这些方法:

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

实例化该类,获取一个 Writer,向其写入。内容填满后,使用 outToWriter 首先将数据流式传输到 S3,然后使用另一个 Writer 将数据流式传输到文件。或者使用阅读器(如果这样更方便)。

问题提到了面向字符的 Writer,但如果您真的想使用字节,也可以使用字节流方法。

这个类是开源的,但在这里提及它被认为是自我推销,所以它已被删除。

© www.soinside.com 2019 - 2024. All rights reserved.