我必须在java中读取一个包含2MB漂亮打印JSON的URLConnection响应。
2mb不是“小”但绝不大。它包含JSON。然而,它是非常印刷的JSON,大约有6万行。甲
while ((line = bufferedReader.readLine()) != null) {
lineAllOfIt += line;
}
大约需要10分钟才能阅读此回复。我的方法一定有问题,但我无法想出更好的方法。
答案 0 :(得分:1)
对于这种特殊情况,我会使用java在本地缓存文件,你可以将文件内存传输到你的计算机,然后你可以逐行浏览它而不将文件加载到内存中并拔出您需要的数据或一次加载所有数据。
编辑:对变量名称进行了更改我从代码中删除了这个并忘记中和变量。 FileChannel transferTo / transferFrom也可以更高效,因为副本可能更少,并且取决于操作可能来自SocketBuffer - >磁盘。 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方法可以防止将行读入堆中。如果您想要读取整个文件,您也可以使用Javas Files
实用程序方法中的许多方法从缓存文件本地执行此操作。