我需要一种更快的方法从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文件,但上述操作无效。谢谢!
答案 0 :(得分:0)
答案 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();
});