如何通过java代码下载大数据文件,其中数据是以块的形式提取的?

时间:2017-11-27 06:41:34

标签: java file download fetch chunks

我需要将批量数据放入文件中。当我尝试将数据写入到镜头中的文件时,有时我在我的java代码中得到OutOfMemoryException。为了处理这种情况,我试图编写不同的代码,我需要打开文件一次和write the data to file in chunk,以便我的堆内存不会增长。因此,我是looking for the best approach。我的源数据将是rest service's response data。我会将该数据写入目标文件。

请建议我将数据写入文件的最佳方法......

我试图通过遵循逻辑来处理这种情况......

  • 将输出文件打开为BufferOutputStream
  • 从其他获取请求中获取响应
  • 将该响应转换为byte []
  • buffOut.write(arr, 0, available);
  • 将byte []写入文件
  • 刷新fileBufferObject buffOut.flush();
  • 依此类推,直到我们有数据写入文件。

2 个答案:

答案 0 :(得分:0)

考虑到您的用例后,

Java Streams 看起来非常合适。与文件扫描程序,缓冲读取器或使用内存映射文件的Java NIO相比,处理文件基于Java流产生更好的结果

以下是各种Java替代品的处理能力的性能比较:

文件大小: - 1 GB

  1. Sanner方法:总耗时: 15627 ms

  2. Maped Byte Buffer:线程“main”中的异常java.lang.OutOfMemoryError:Java堆空间

  3. Java 8 Stream:总耗用时间: 3124 ms

  4. Java 7文件:总耗用时间: 13657 ms

  5. 样品处理实例如下:

    section.content .features .overlay svg{
        path,polygon{
            &#hood {
                stroke-dasharray:1000;
                stroke-dashoffset:1000;
                animation:draw 5s linear forwards
            }
        }
    }
    
    @keyframes draw{
        to{stroke-dashoffset:0}
    }
    

答案 1 :(得分:0)

尝试以下方法:

URL url = new URL("http://large.file.dat");
Path path = Paths.get("/home/it/documents/large.file.dat");
Files.copy(url.openStream(), path);

Chunked应该无关紧要,除非您希望在一段时间后连接可能失败时使用文件的某些部分。

您可以使用压缩发送标头并将InputStream包装在GzippedInputStream中。或者使用apache的 HttpClient 并提供开箱即用的支持。