我有一个非常大的文件(几个GB)的AWS S3,而我只需要少量的文件中的线,满足一定条件的。我不希望加载在内存中的整个文件,然后搜索和打印这些几行字 - 此内存负载会太高。以正确的方式将只加载所需要的内存中的那些行。
按照AWS文件从文件中读取:
fullObject = s3Client.getObject(new GetObjectRequest(bucketName, key));
displayTextInputStream(fullObject.getObjectContent());
private static void displayTextInputStream(InputStream input) throws IOException {
// Read the text input stream one line at a time and display each line.
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
System.out.println();
}
在这里,我们使用的是BufferedReader中。这是我不清楚发生了什么下面在这里。
难道我们做每一次,我们正在阅读一个新行,且只保留当前行缓冲区中的网络呼叫S3?抑或是整个文件在内存中加载,然后通过读取的BufferedReader行由行?或者是介于两者之间?
其中一个问题的答案,你链接的文档中已经给出:
您的网络连接保持打开状态,直到你读所有的数据或关闭输入流。
一个BufferedReader
不知道它会读取数据是从,因为你传递的另一个未来Reader
吧。甲BufferedReader
创建特定大小的缓冲液(例如4096个字符),并通过从底层填充读取该缓冲器Reader
开始发放的呼叫数据之前read()
或read(char[] buf)
。
在Reader
您传递到BufferedReader
是-顺便说一句-用另一个缓冲区为自己做从转换byte
基于流为char
基础的读者。它的工作方式与相同BufferedReader
,因此内部缓冲区由从通过读取填充InputStream
它是InputStream
由您的S3-客户端返回。
如果你从流尝试加载数据这个客户端中到底会发生依赖于实现。一种方法是保持一个开放的网络连接,你可以从它如你所愿或数据块已经被读取,当你试图让下一个新打开后的网络连接可以关闭阅读。
上面引述的文件似乎是说,我们已经得到了前一种情况在这里,所以:没有,电话readLine
都没有导致单一的网络电话。
并回答您的其他问题:没有,一BufferedReader
中,InputStreamReader
最有可能的InputStream
由S3客户端返回的不是整个文件到内存中加载。这将违背首先使用流和S3客户可以简单地返回的整个目的byte[][]
,而不是(来左右的2 ^ 32个字节每极限byte
-阵列)
编辑:有最后一段的一个例外。如果整个千兆字节大文件没有换行符,要求readLine
实际上将导致读取整个数据到内存(最有可能的OutOfMemoryError错误)。我认为一个“正规”的文本文档,同时回答你的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句