在java中下载文件的速度更快

时间:2016-06-17 11:58:52

标签: java file download

我需要一种更快的方法从Java中的url下载文本文件。对于大约2400行的文件,代码大约需要2分钟(132秒)。问题是我需要每分钟更新一次,如果处理时间超过2分钟,那就太傻了。

这是我到目前为止所尝试的:

public void readFileOnline() throws Exception{
    Long now  = new Date().getTime();

    URL oracle = new URL("myurl");
    BufferedReader in = new BufferedReader(
    new InputStreamReader(oracle.openStream()));

    String currentline;
    while ((currentline = in.readLine()) != null){
//        Location location = gson.fromJson(currentline, Location.class);
//        locations.put(location.getTime(), location);
          locations.add(currentline);
    }

    in.close();

    Long done = new Date().getTime();
    System.out.println("TOTAL TIME " +  (done-now));

}

如您所见,需要进行一些线处理。所以我尝试评论线的处理,只是将线保存在一个集合中,但似乎没有真正的速度优化。

我还尝试下载该文件并将其存储为临时文件:

public String downloadAsTemp() throws Exception{
    Long now  = new Date().getTime();
    String url = "myurl";
    URLConnection request = null;
    request = new URL(url).openConnection();

    InputStream in = request.getInputStream();
    File downloadedFile = File.createTempFile("temp", "end-of-file");
    FileOutputStream out = new FileOutputStream(downloadedFile);
    byte[] buffer = new byte[1024];
    int len = in.read(buffer);
    while (len != -1) {
        out.write(buffer, 0, len);
        len = in.read(buffer);
        if (Thread.interrupted()) {
            throw new InterruptedException();
        }
    }
    in.close();
    out.close();


    Long done = new Date().getTime();
    System.out.println("TOTAL TIME " +  (done-now));

    return downloadedFile.getAbsolutePath();
}

它给出了相同的结果(大约2分钟)。我开始使用改造2来下载文件。不幸的是,在我的搜索过程中,我发脾气并删除了代码。总的来说,你可以说即使使用Retrofit,也需要很长时间。文件大小约为50MB,文件行往往会很长。

我也偶然发现了this,但这篇文章的日期是2011年,肯定会有更新,更快的方式吗?此外,FileUtils链接已经死了:-)。

基本上,我需要能够在1分钟内从服务器下载和处理50MB文件,但上述操作无效。谢谢!

2 个答案:

答案 0 :(得分:0)

使用Apache Commons IO

我认为IOUtils课程对你的工作来说足够快。

但当然 - 这取决于你的连接速度......

答案 1 :(得分:0)

我使用以下文件下载大小约为 500Mb 的文件。您需要 springFramework 才能使用它。我发现下载速度与使用浏览器下载相似。

import org.springframework.util.StreamUtils;

final File downloadedFile = restTemplate.execute(FILE_URL, HttpMethod.GET, null, response -> {
            System.out.println("statusTest : "+ response.getStatusText());
            final Path downloadedFilePath = feedsParentDir.resolve("downloaded.type");
            Files.deleteIfExists(downloadedFilePath);
            StreamUtils.copy(response.getBody(), new FileOutputStream(downloadedFilePath.toFile()));
            return downloadedFilePath.toFile();
        });