« PNG ファイルをダウンロードしない Ruby スクリプト | メイン | W3CDTF フォーマットの日時文字列を出力する »

2005年05月17日

PNG ファイルをダウンロードしない Java プログラム

スレッドを使って同時にひたすらHTTPリクエストするスクリプト……を Ruby で作ってうまくいかなかったので、泣く泣く Java で作りなおし。
せっかくなので、いままで使ったことがなかった Java 5.0(JDK1.5? Java 2 SDK 5.0? いまいちバージョンがわかりづらいな) で作ってみる。


import java.io.*;
import java.net.*;
import java.util.*;
 
public class Attack {
 
  private static class Accessor extends Thread {
    private static int counter;
    private final URL url;
    private final int number;
    private Accessor(URL url){
      this.number = counter++;
      this.url = url;
    }
    public void run(){
      HttpURLConnection con = null;
      try{
        con = (HttpURLConnection)url.openConnection();
        con.connect();
        System.out.println(
          "[" + number + "]" + con.getResponseCode());
        con.disconnect();
      }catch(IOException e){
        e.printStackTrace();
      }finally{
        if(con != null){
          con.disconnect();
        }
      }
    }
  }
 
  public static void main(String[] args) throws Exception {
 
    String filepath = args[0];
 
    int alltime = -1;
    if(args.length > 1){
      alltime = Integer.parseInt(args[1]);
    }
 
    List urls = new ArrayList();
    {
      BufferedReader in = null;
      try{
        in = new BufferedReader(new FileReader(filepath));
        String url;
        while((url = in.readLine()) != null){
          urls.add(url);
        }
      }catch(IOException e){
        e.printStackTrace();
      }finally{
        if(in != null){
          in.close();
        }
      }
    }
 
    List accessors = new ArrayList();
    for(String url : urls){
      accessors.add(new Accessor(new URL(url)));
    }
 
    long interval = 0;
    if(alltime != -1){
      interval =
        (long)(((double)alltime / urls.size()) * 1000.0);
    }
 
    long begintime = System.currentTimeMillis();
    for(Accessor a : accessors){
      a.start();
      Thread.sleep(interval);
    }
    for(Accessor a : accessors){
      a.join();
    }
    long endtime   = System.currentTimeMillis();
    System.out.println("[Time]" + (endtime - begintime));
  }
 
}

とりあえず、ジェネリックスと foreach な感じのコレクションの反復処理を使ってみた。

参考:

投稿者 NI-Lab. Twitter: @nilab : 2005年05月17日 22:29

コメント

Generics 使われてる形跡がないんですが(笑
拡張 for 文は、(環境依存かもしれないけれど) size() を取りながら int でまわすより遅いことがあるので注意。

投稿者 カリウド : 2005年05月19日 17:48

ありゃ? ほんとだ、Generics 使ってないや (^_^;
一度、Generics で書いたあと、拡張 for を使うときに要らなくなって消しちゃったかな。

拡張 for が遅いのは、Iterable だっけそんな Iterator 使ってますよ的なことをしているからとか?

J2SE 5.0 Tiger 虎の穴 拡張 for 文
http://www5.airnet.ne.jp/sakuraba/java/laboratory/J2SE1.5/LangSpec/ExtendedFor/ExtendedFor.html

っぽいね。

投稿者 NI-Lab. : 2005年05月19日 22:55

Please post your comments -> Ido-Batarian BBS
コメントはこちらの Ido-Batarian BBS へどうぞ。

« PNG ファイルをダウンロードしない Ruby スクリプト | メイン | W3CDTF フォーマットの日時文字列を出力する »

人気ブログランキング - NI-Lab.'s ヅラッシュドット [Valid RSS]