我必须读取一个 URLConnection 响应,其中包含 2MB 的 Java 打印的漂亮 JSON。
2mb 不算“小”,但也绝不大。它包含 JSON。然而,它是打印精美的 JSON,大约有 6 万行。
while ((line = bufferedReader.readLine()) != null) {
lineAllOfIt += line;
}
阅读此回复大约需要 10 分钟。我的方法肯定有问题,但我无法想象更好的方法。
最佳答案
对于这种特殊情况,我会使用java在本地缓存文件,您可以将文件传输到计算机的低内存传输,然后您可以逐行浏览它,而无需将文件加载到内存中并拉出您需要的数据或一次加载全部数据。
编辑:对变量名称进行了更改,我从代码中提取了它,但忘记中和变量。此外,FileChannel TransferTo/transferFrom 可以更加高效,因为副本可能较少,并且根据操作可以从 SocketBuffer -> Disk 进行。 FileChannel API
String urlString = "http://update.domain.com/file.json" // File URL Path
Path diskSaveLocation = Paths.get("file.json"); // This will be just help place it in your working directory
final URL url = new URL(fileUrlString);
final URLConnection conn = url.openConnection();
final long fileLength = conn.getContentLength();
System.out.println(String.format("Downloading file... %s, Size: %d bytes.", fileUrlString, fileLength));
try(
FileOutputStream stream = new FileOutputStream(diskSaveLocation.toFile(), false);
FileChannel fileChannel = stream.getChannel();
ReadableByteChannel inChannel = Channels.newChannel(conn.getInputStream());
) {
long read = 0;
long readerPosition = 0;
while ((read = fileChannel.transferFrom(inChannel, readerPosition, fileLength)) >= 0 && readerPosition < fileLength) {
readerPosition += read;
}
if (fileLength != Files.size(diskSaveLocation)) {
Files.delete(diskSaveLocation);
System.out.println(String.format("File... %s did not download correctly, deleting file artifact!", fileUrlString));
}
}
System.out.println(String.format("File Download... %s completed!", fileUrlString));
((HttpURLConnection) conn).disconnect();
您现在可以使用 NIO2 方法读取同一文件,该方法允许您逐行读取而无需加载到内存中。使用 Scanner 或 RandomAccessFile 方法,您可以防止将行读入堆中。如果您想读取整个文件,也可以使用 Java Files
实用程序方法中的许多方法从缓存文件本地读取。
关于Java高效读取多行URLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568096/