- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 AWS S3 中有一个非常大的文件(几 GB),我只需要文件中满足特定条件的少量行。我不想将整个文件加载到内存中,然后搜索并打印那几行——这样做的内存负载会太高。正确的方法是只加载内存中需要的那些行。
根据 AWS 文档 to read from file :
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 逐行读取?还是介于两者之间?
最佳答案
您所链接的文档中已经给出了您问题的其中一个答案:
Your network connection remains open until you read all of the data or close the input stream.
BufferedReader
不知道它读取的数据来自哪里,因为您正在将另一个 Reader
传递给它。 BufferedReader
创建一个特定大小的缓冲区(例如 4096 个字符),并在开始分发 的调用数据之前通过从底层
或 Reader
读取来填充此缓冲区read()read(char[] buf)
。
您传递给 BufferedReader
的 Reader
是 - 顺便说一句 - 使用另一个缓冲区为自己进行从 byte
的转换 -基于流到基于 char
的阅读器。它的工作方式与 BufferedReader
相同,因此通过读取传递的 InputStream
来填充内部缓冲区,这是您的 S3 返回的 InputStream
-客户。
如果您尝试从流中加载数据,此客户端中究竟发生了什么取决于实现。一种方法是保持打开一个网络连接,您可以根据需要从中读取,或者可以在读取一大块数据后关闭网络连接,并在您尝试获取下一个数据时打开一个新连接。
上面引用的文档似乎说我们在这里遇到了前一种情况,所以:不,调用 readLine
不会导致单个网络调用。
然后回答您的其他问题:不,S3 客户端返回的 BufferedReader
、InputStreamReader
和很可能是 InputStream
是没有将整个文档加载到内存中。这将首先与使用流的整个目的相矛盾,S3 客户端可以简单地返回一个 byte[][]
来代替(绕过每个 byte 2^32 字节的限制
-array)
编辑:最后一段有一个异常(exception)。如果整个千兆字节的大文档没有换行符,调用 readLine
实际上会导致将整个数据读入内存(很可能会导致 OutOfMemoryError)。在回答您的问题时,我假定使用的是“常规”文本文档。
关于java - BufferedReader 如何从 S3 读取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51505857/
我可以做这个科目吗?我的意思是: BufferedReader reader1 = new BufferedReader(new FileReader(new File("file"))); Bu
这个问题已经有答案了: Unhandled Exception Type IOException [duplicate] (4 个回答) Java: import statement vs fully
PrintWriter out = new PrintWriter(DoDSocket.getOutputStream(), true); BufferedReader in = ne
我是java新手。我想从 java 启动的进程中读取标准输出。我在谷歌搜索中得到了以下代码: Runtime rt = Runtime.getRuntime(); Process pr
这个问题已经有答案了: Stream closed and not reopened - Java (2 个回答) Closing Reader/Stream in Java [duplicate]
我有一个片段如下: Process proc = Runtime.getRuntime().exec(command); BufferedReader br = new BufferedReader(
1. 概述 在这个例子中,我们将使用一个BufferedReader类来读取一个名为 "sample.txt "的文件。 BufferedReader类是用来从基于字符的
我正在 youtube 上查看有关 BufferedReader 的教程 https://www.youtube.com/watch?v=yofFVbARIRU 我完全按照他的方式编写代码,但我无法让
我正在尝试编写一个方法来获取一个多行制表符分隔的文件,并将该文件的内容作为字符串数组的数组列表返回(每一行都是一个字符串[],每个这样的字符串[]都是一个元素一个数组列表)。我的问题是,我无法判断输出
我需要从 Java InputStream 中读取以零结尾的字符串。 有没有类似BufferedReader.readLine()的读取零结尾字符串的方法? 最佳答案 package com; imp
String str = ""; try { BufferedReader br = new BufferedReader(new FileRe
我用下面的样式用BufferedReader读取文件 try (BufferedReader br = new BufferedReader(new FileReader("my_file"))) {
我正在编写一些使用clojure.async的函数,以从读取/写入套接字抽象出来。我的目的是可以将值放入 channel 中以进行写入,并从要读取的 channel 中弹出。这样,用户无需担心Read
我正在尝试使用缓冲读取器读取文件,但有时它会跳过一行中的第一个字符。这是我正在阅读的文件: http://files.moonmana.com/forums/Rectangle.h 这是我得到的结果:
我是 Java 新手,我正在尝试使用此类返回 "test.csv" 的内容。这只在我使用本地文件的路径时才有效。 public class CSVtoArray2 { public stati
我正在使用 BufferedReader.readLine() 逐行读取文本文件,但突然它不读取整行,而是只读取仅第一个字符串 示例:如果文本文件中的第一行是: [98.0,20.0,-65.0]
读完整个字符串后,读者会停留在 while 中,甚至不会抛出异常。我正在通过curl 向服务器发送请求。 我尝试更改 curl 的内容类型,更改字符串的内容,并使用另一种方式读取输入,例如扫描仪,但总
我正在使用 BufferedReader 从 ma url 获取数据。 URL url = new URL("http://"); BufferedReader in = new Buffered
我有一个缓冲阅读器,由于某种原因,它不会从我从客户端发送的打印流中读取文本。这是每次 line = in.readline 时失败的点 我也检查过并且服务器已连接。 这是错误 java.net.Soc
第一次这个循环迭代效果很好,但在我按字符“y”以重复之后,下次显示时,它不会让我输入另一个名称。我不知道是什么原因造成的,但是当你需要清除输入缓冲区时,它让我想起了 C。 任何帮助我们都将不胜感激。
我是一名优秀的程序员,十分优秀!