Java 是否可以将BufferedWriter的内容作为字符串获取?
因此,我们有一些操作,它们使用BufferedWriter在服务器上写入文件。在刷新BufferedWriter之前,我想将内容上传到S3 bucket。目前(不恰当地)我正在收集BufferedWriter使用StringBuilder编写的每个字符串(每次都追加),但这是一个巨大的字符串(~150mb)。因此,最好只直接写入BufferedWriter中存储的内容。我一直在网上搜索,但我找不到这个问题的确切答案Java 是否可以将BufferedWriter的内容作为字符串获取?,java,string,amazon-s3,bufferedwriter,Java,String,Amazon S3,Bufferedwriter,因此,我们有一些操作,它们使用BufferedWriter在服务器上写入文件。在刷新BufferedWriter之前,我想将内容上传到S3 bucket。目前(不恰当地)我正在收集BufferedWriter使用StringBuilder编写的每个字符串(每次都追加),但这是一个巨大的字符串(~150mb)。因此,最好只直接写入BufferedWriter中存储的内容。我一直在网上搜索,但我找不到这个问题的确切答案 这是可能的,而且代码很少吗?一个BufferedWriter只不过是其他编写器的
这是可能的,而且代码很少吗?一个
BufferedWriter
只不过是其他编写器的包装器。因此,它将取决于传递给其构造函数的编写器的类型
支持回读功能的Writer
类型包括和,允许您分别以char[]
和String
的形式读取内容。您将BufferedWriter用作缓存,缓存整个流,然后将其写入两个位置
我使用的是一个MemFile类,它在内存中存储流的效率比StringBuilder或ByteArrayOutputStream要高得多,因为它不必在单个连续块中分配内存
此类可在以下位置获得开放源代码:
这些方法存在:
java.io.Reader getReader();
java.io.Writer getWriter();
void outToWriter(java.io.Writer w);
实例化该类,获取一个编写器,然后写入它。一旦它充满了内容,使用outToWriter首先流式传输到S3,然后使用另一个编写器流式传输到文件。如果方便的话,也可以使用阅读器
这个问题提到了面向字符的编写器,但是如果您真的想使用字节,那么也有字节流方法
文件载于:
是否可以将BufferedWriter
的内容作为字符串获取
不,这是不可能的
BufferedWriter
仅保存已写入数据的“一个缓冲区已满”。这还不足以满足你的需要。其余的数据将被写入该文件,并且在内存中不再可用。(此外,编写器的缓冲区故意隐藏在抽象层后面,如果不进行“讨厌的”反射,您将无法获得它。)
现在,您可以向输出堆栈添加一个或多个额外组件,以在内存中捕获输出。例如,您可以使用ApacheTeeOutputStream
类()拆分数据,并将第二个副本写入ByteArrayOutputStream
。或者,您可以将第二个副本直接写入S3输出流
另一种方法是通过tearrayoutputstream“接收”要写入的数据,提取字节数组并将其写入文件一次,第二次写入流到S3存储桶
如果文件可能很大,最好避免将整个文件内容保存在内存中 为什么不同时写入文件和S3?您可以将BufferedWriter
包装在StringWriter
周围。不幸的是,文件是按顺序写入服务器位置的,而且S3不允许附加到对象,我必须等到文件完全写入后再上传到S3。使用FilterWriter。实现“write”方法来执行您想要执行的操作,然后调用相应的“out.write”方法。为什么要在BufferedWriter完成其工作之前(即关闭编写器之前)上载内容?