Java高效读取多行URLConnection

标签 java service get request urlconnection

我必须读取一个 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 Read Large Text File With 70million line of text

关于Java高效读取多行URLConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568096/

相关文章:

c# - HttpListener 问题

java - TEXT 后面必须紧跟着 END_TAG,而不是 START_TAG

java - 如何更新测试类中intellij idea插件的持久状态?

.net - 作为服务运行时找不到 PowerShell 模块

javascript - net::ERR_CONNECTION_REFUSED 错误 jQuery ajax node.js

Android HTTP GET登录方法

java - 获取 API 请求在 Jmeter 中无法使用 "+"符号

java - 如何将一个类调用到另一个具有不同参数的类中?

java - 为什么 Java Map 不扩展 Collection?

javascript - 定义可能需要修改 AngularJS 中 $scope 数据的实用程序/帮助程序方法的理想方法是什么