そこに画像付きのURLがあります。この画像はリクエストごとに更新されます (つまり、(同じ) URL への各リクエストは新しい画像を返します)。たとえば、この URL は CAPTCHA を指しています。私の目標は、私のプログラムでそのような画像をいくつか読み込んで表示することです。
次のコードは、これらのイメージをローカル ファイル システムにロードし、正常に動作します (つまり、すべてのイメージは異なり、一意です)。
String filePath;
String urlPath;
int numOfFilesToDownload;
//Here filePath and urlPath are initialized.
//filePath points to the directory, where to save images
//urlPath is the url from where to download images
//numOfFilesToDownload is the number of files to download
for(int i = 0; i < numOfFilesToDownload; i++){
//Initializing connection
URL url = new URL(urlPath);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//Downloading image
try(InputStream is = conn.getInputStream();
FileOutputStream os = new FileOutputStream(filePath + "img" + i + ".jpg")){
int b;
while((b = is.read()) != -1)
os.write(b);
}
}
しかし、次のことを試してみると、奇妙なことが起こります。
for(int i = 0; i < numOfFilesToDownload; i++){
//Initializing image from the url
URL url = new URL(urlPath);
javax.swing.ImageIcon ico = new javax.swing.ImageIcon(url);
//Showing the graphical dialog window with the image
javax.swing.JOptionPane.showMessageDialog(null, ico);
}
後者の場合、各ダイアログには同じ画像、つまり最初の繰り返しでダウンロードされた画像が含まれています。
また、実験では、"?r=" を urlPath (つまり、単純な GET 要求パラメーター) に連結すると、url が引き続き有効になることが示されています。そして、次のコードは有効であるように見え、それが持っていることを正確に実行します(つまり、表示されている各画像は前のものとは異なります):
for(int i = 0; i < numOfFilesToDownload; i++){
//Initializing image from the url
URL url = new URL(urlPath + "?r=" + i);
javax.swing.ImageIcon ico = new javax.swing.ImageIcon(url);
//Showing the graphical dialog window with the image
javax.swing.JOptionPane.showMessageDialog(null, ico);
}
したがって、ImageIcon は処理した URL を何らかの形で記憶しており、同じ作業を 2 回実行する必要がないという結論を下すことができます...なぜ、どのように? それについてのjavadocsには何もありません。