情况:我有一个ArrayList<String>
包含一堆图像链接(http:/www.foo.com/bar/image1.jpg,http:/ /www.foo.com/bar/image2巴纽,...等)更有效地从URL下载图像
我发现的代码工作片,以便通过一个下载这些文件之一:
public void run() {
try {
int counter = 1;
for (String image : imagesList) {
controller.setDownloadStatusTextArea("Downloading image " + counter + " of " + imagesList.size());
URL u = new URL(image);
URLConnection uc = u.openConnection();
String contentType = uc.getContentType();
int contentLength = uc.getContentLength();
InputStream raw = uc.getInputStream();
InputStream in = new BufferedInputStream(raw);
byte[] data = new byte[contentLength];
int bytesRead;
int offset = 0;
while (offset < contentLength) {
bytesRead = in.read(data, offset, data.length - offset);
if (bytesRead == -1)
break;
offset += bytesRead;
}
in.close();
if (offset != contentLength) {
throw new IOException("Only read " + offset + " bytes; Expected " + contentLength + " bytes");
}
String[] tmp = image.split("/");
String filename = tmp[tmp.length - 1];
FileOutputStream out = new FileOutputStream(filename);
out.write(data);
out.flush();
out.close();
counter++;
}
controller.setDownloadStatusTextArea("Download complete");
} catch (Exception ex) {
controller.setDownloadStatusTextArea("Download failed");
}
}
这是我第一次做这样的事情在Java中,并且我有一种感觉,通过在for循环之外移动一堆变量,该代码可以更加高效。但我不确定哪些可以安全地移出境外,而不会影响功能和/或性能(无论是消极的还是积极的方式)。在这种情况下的洞察力将不胜感激。 另外:我可以指定文件需要下载到的位置吗?现在他们只出现在项目文件夹中,我希望用户能够更改他的下载文件夹。
在此先感谢。
因此,我创建并销毁每次迭代中使用的对象并不重要? – Matthias
可能成为问题的唯一对象是数组。如果我没有弄错,Java会初始化该数组,这对大文件可能会造成麻烦。不过,我不认为这是你的情况。 – slezica
在必要之前不要进行优化。如果此代码稍后为您带来麻烦,并且希望使其更快,则可以将缓冲区(数组)放在循环外,将其大小固定在一个合适的数字上,并在每次文件满时写入文件。 – slezica