状況:ArrayList<String>
には画像へのリンクが多数含まれています(http:/www.foo.com/bar/image1.jpg、http:/www.foo.com/bar/image2 .PNG、...など)より効率的に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