3

そこに画像付きの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には何もありません。

4

1 に答える 1

2

あなたのコードのバリエーションを試したところ、うまくいきました。私のSSCCE

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class TestUrls {
   public static final String BASE_URL_PATH = "http://static.ed.edmunds-media.com/" +
        "unversioned/adunit/homepage_showcase/";
   public static final String[] URL_PATHS = {
      "honda-odyssey-2013.png",
      "chevrolet-impala-2013.png",
      "mazda-cx9-2013.png",
      "toyota-rav4-2013-2.png"
   };

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            for (String urlPath : URL_PATHS) {
               String fullUrlPath = BASE_URL_PATH + urlPath;
               try {
                  URL url = new URL(fullUrlPath);
                  BufferedImage img = ImageIO.read(url);
                  ImageIcon icon = new ImageIcon(img);
                  JOptionPane.showMessageDialog(null, icon);
               } catch (MalformedURLException e) {
                  e.printStackTrace();
               } catch (IOException e) {
                  e.printStackTrace();
               } 
            }
         }
      });
   }
}
于 2013-02-11T21:42:42.607 に答える