スピード測定(画像も含めたもの)
戻る
::::::::::::::
AbsolutePathObtainer.java
::::::::::::::
import java.util.*;
import java.util.regex.*;
import java.io.*;
import java.net.*;
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
* @author KISHI Yasuhiro
* 絶対URLに変換する
*/
public class AbsolutePathObtainer {
/** 相対パスから絶対パスに変更する
* @param currentUrl 処理しているURL
* @param path リンク先のパス
* @return 絶対パス
*/
static public String getAbsolutePath( URL currentUrl, String path ) {
if ( path.toLowerCase().startsWith( "http:" )
|| path.toLowerCase().startsWith( "https:" )
|| path.toLowerCase().startsWith( "ftp:" )
|| path.toLowerCase().startsWith( "mailto:" )
) {
/* do nothing */
} else if ( path.startsWith( "/" ) ) {
/* / でスタートするのは、ホスト内の絶対パス表記であるので、プロトコルとホスト名を頭に付ける */
path = currentUrl.getProtocol() + "://" + currentUrl.getHost() + path;
} else if ( path.startsWith( "./" ) ) {
// 先頭の "./" を削除する
path = path.replaceAll( "^./", "" );
path = getDirName( currentUrl ) + path;
} else if ( path.startsWith( "../" ) ) {
path = getParentPath( currentUrl, path );
} else {
path = getDirName( currentUrl ) + path;
}
return path;
}
/** URLからディレクトリ名を得る
* @param url URL
* @return ディレクトリ名
*/
static private String getDirName( URL url ) {
String dirName = null;
Pattern p;
Matcher m;
p = Pattern.compile( "^(.+/).*$" );
m = p.matcher( url.toString() );
if ( m.find() ) {
dirName = m.group( 1 );
}
// System.err.println( " *** DEBUG *** in getDirName :");
// System.err.println( "\t" + "urlString = " + urlString + " dirName = " + dirName
// + " プロトコル = " + url.getProtocol() );
if ( dirName.equals( url.getProtocol() + "://" ) ) {
dirName = url.toString() + "/";
}
return dirName;
}
/** 上位の相対パスを処理する
@param url 処理しているURL
@param relativePath ../などが先頭に付いたパス
@return ../などを削除して書き直したもの
*/
static private String getParentPath( URL url, String relativePath ) {
Pattern p;
Matcher m;
String parentPath = null;
String tempPath = url.getProtocol() + "://" + url.getHost() + url.getPath();
int count = 0;
while ( relativePath.startsWith( "../" ) ) {
//==========================================================================
// 末尾のディレクトリ名あるいはディレクトリ名+"/"+ファイル名を削除
//==========================================================================
p = Pattern.compile( "(.+/).+/.*$" );
m = p.matcher( tempPath );
if ( m.find() ) {
tempPath = m.group( 1 );
}
//==========================================================================
// 相対パスの先頭の"../"を削除する
//==========================================================================
p = Pattern.compile( "^\\.\\./(.*)$" );
m = p.matcher( relativePath );
if ( m.find() ) {
relativePath = m.group( 1 );
}
}
return tempPath + relativePath;
}
/**
* テストコード
*/
public static void main( String[] args ) throws Exception {
URL baseURL = new URL( "http://www.abc.co.jp/xxx/yyy/" );
System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "../../test.jpg" ) );
System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "../test.jpg" ) );
System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "./test.jpg" ) );
System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "test.jpg" ) );
System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "/test.jpg" ) );
System.out.println( AbsolutePathObtainer.getAbsolutePath( baseURL, "http://www.abc.co.jp/OPQ/test.jpg" ) );
}
}
::::::::::::::
ContentObtainer.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/
public class ContentObtainer {
public String getResponseBodyAsString( String urlString, String encoding ) throws Exception {
StringBuilder sb = new StringBuilder();
URL url;
try {
url = new URL( urlString );
HttpURLConnection connection = ( HttpURLConnection ) url.openConnection();
//---------------------------------------------------------------
// ユーザ・エージェントの設定
//---------------------------------------------------------------
String userAgent = RagUtil.sha1Digest( new Date().toString() + "128-256-384-512-640-768" );
if ( ( url.hashCode() + userAgent.hashCode() ) % 2 == 0 ) {
userAgent = userAgent.toUpperCase();
}
connection.setRequestProperty( "User-Agent", userAgent );
// System.err.println( "User-Agent: " + userAgent );
//---------------------------------------------------------------
// HTTP応答コードの取得
//---------------------------------------------------------------
int responseCode = connection.getResponseCode();
System.out.println( urlString + ": 応答コード=" + responseCode + "\n" );
BufferedReader reader = new BufferedReader( new InputStreamReader(
connection.getInputStream(), encoding ) );
String line;
while ( ( line = reader.readLine() ) != null ) {
sb.append( line + "\n" );
}
reader.close();
} catch ( Exception e ) {
throw e;
}
return sb.toString();
}
}
::::::::::::::
DownloaderRunnable.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/
public class DownloaderRunnable implements Runnable {
private String target;
private long size;
public DownloaderRunnable( String target ) {
this.target = target;
}
public void run() {
ImageDownloader downloader = new ImageDownloader( target );
size = downloader.download();
}
public long getSize() {
return size;
}
}
::::::::::::::
ImageDownloadManager.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/
public class ImageDownloadManager {
public static void download( java.util.Set urlSet ) {
Iterator iterator = urlSet.iterator();
while ( iterator.hasNext() ) {
String target = ( String ) iterator.next();
System.out.println( target );
DownloaderRunnable runnable = new DownloaderRunnable( target );
Thread thread = new Thread( runnable );
thread.start();
try {
thread.join();
} catch ( Exception e ) {
e.printStackTrace();
}
}
System.out.println( "完了しました!" );
}
}
::::::::::::::
ImageDownloader.java
::::::::::::::
import java.io.*;
import java.net.*;
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/
public class ImageDownloader {
private String urlString;
private BufferedOutputStream bos;
private OutputStream out = null ;
private long iSize = 0;
public ImageDownloader( String urlString, OutputStream out ) {
this.urlString = urlString;
this.out = out;
}
/**
* 空読みする場合
*/
public ImageDownloader( String urlString ) {
this.urlString = urlString;
}
public long download() {
try {
//-------------------------------------------------
// URL の作成
//-------------------------------------------------
URL url = new URL( urlString );
// コネクトして、HttpURLConnection の作成
HttpURLConnection connection = ( HttpURLConnection ) url.openConnection();
connection.setRequestMethod( "GET" );
//---------------------------------------------------------------
// HTTP応答コードの取得
//---------------------------------------------------------------
int responseCode = connection.getResponseCode();
System.out.println( "\t応答コード=" + responseCode );
if ( out != null ) {
// 出力ストリーム
bos = new BufferedOutputStream( out );
}
// 入力ストリーム
BufferedInputStream bis = new BufferedInputStream( connection.getInputStream() );
int size = bis.available();
byte[] buf = new byte[ size ];
int len = 0;
while ( ( len = bis.read( buf ) ) > 0 ) {
if ( out != null ) {
bos.write( buf, 0, len );
}
// 読み込んだサイズを加算
iSize += len;
}
bis.close();
if ( out != null ) {
bos.close();
}
System.out.println( "\t画像ファイルサイズ=" + iSize + "\n" );
} catch ( Exception e ) {
e.printStackTrace();
}
return iSize;
}
static public void main( String[] args ) {
if ( args.length != 1 ) {
System.err.println( "Usage: java -cp . ImageDownloader [URL]" );
System.exit( 1 );
}
String targetUrl = args[ 0 ];
ImageDownloader downloader = new ImageDownloader( targetUrl, System.out );
downloader.download();
}
}
::::::::::::::
ImageURLObtainer.java
::::::::::::::
import java.util.*;
import java.util.regex.*;
import java.io.*;
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
* @author KISHI Yasuhiro
* 正規表現を使って、画像URLを抽出する
*/
public class ImageURLObtainer {
/**
* @param in 処理対象文字列
* @return 取り出した結果のリスト
*/
public static List obtain( String in ) {
List result = new LinkedList();
// 先頭がIMGでそれ以降に初めて出現したSRC属性の値を求める
// ただしシングルクォートあるいはダブルクォートで挟み込まれてなくてはいけない
Pattern p = Pattern.compile( "<IMG.*?\\s+?SRC=(\"|\')(.*?)(\"|\')(.*?>)",
Pattern.CASE_INSENSITIVE | Pattern.DOTALL );
Matcher m = p.matcher( in );
while ( m.find() ) {
result.add( m.group( 2 ) );
}
return result;
}
/**
* テストコード
*/
public static void main( String[] args ) {
String str = "...............<img src=\"AAA.jpg\">.................";
str += "<img src=\"test.gif\" alt=\"aaa\">";
str += "<img width='1000' src=\"test2.gif\" alt=\"aaa\">\n";
str += "<img width='333' src='/test3.ping' alt=\"aaa\">\n";
str += "<img width='999' src='/test3.ping' alt=\"aaa\">\n";
List result = ImageURLObtainer.obtain( str );
Iterator iterator = result.iterator();
while ( iterator.hasNext() ) {
System.out.println( iterator.next() );
}
}
}
::::::::::::::
RagUtil.java
::::::::::::::
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
* @author KISHI Yasuhiro
*/
import java.io.*;
import java.net.*;
import java.util.*;
import java.util.regex.*;
import java.security.MessageDigest;
public class RagUtil {
/** 文字列からSHA1ハッシュ値を求めて16進で表示する
@param str 入力文字列
@return ハッシュ値
*/
static public String sha1Digest( String str ) {
StringBuffer result = new StringBuffer( "" );
try {
MessageDigest md = MessageDigest.getInstance( "SHA1" ); /* MD5のときは"MD5"とすればいいですよ! */
md.update( str.getBytes() );
byte[] digest = md.digest();
for ( int i = 0; i < digest.length; i++ ) {
if ( ( digest[ i ] & 0x0ff ) / 16 == 0 ) {
result.append( "0" );
}
result.append( Integer.toHexString( digest[ i ] & 0x0ff ) );
}
} catch ( Exception e ) {}
return result.toString();
}
}
::::::::::::::
WebClientEmulator.java
::::::::::::::
import java.net.*;
import java.io.*;
import java.util.*;
/**
* $Id: ResponseTime.html,v 1.1 2009/06/22 16:11:54 kishi Exp kishi $
*/
public class WebClientEmulator {
public static void main( String[] args ) {
if ( args.length != 2 ) {
System.out.println( "Usage: java -cp . WebClientEmulator [url] [encoding]" );
System.exit( 1 );
}
String urlAsString = args[ 0 ];
String encoding = args[ 1 ];
/******************************************************************************/
/* 接続タイムアウトの設定; 設定された時間でコネクトできない場合はタイムアウト */
/******************************************************************************/
System.setProperty ( "sun.net.client.defaultConnectTimeout", "10000" );
/**********************************************************************************/
/* 読み取りタイムアウトの設定; 設定された時間で読み取りできない場合はタイムアウト */
/**********************************************************************************/
System.setProperty ( "sun.net.client.defaultReadTimeout", "10000" );
Iterator iterator;
long elapsedTime, start, end;
start = System.currentTimeMillis();
long totalImageSize = 0;
try {
//-------------------------------------------------------
// 対象URLのレスポンスボディを取得
//-------------------------------------------------------
ContentObtainer obtainer = new ContentObtainer();
String resBody = obtainer.getResponseBodyAsString( urlAsString, encoding );
//-------------------------------------------------------
// IMGタグ内に含まれるURLを取り出す
//-------------------------------------------------------
List result = ImageURLObtainer.obtain( resBody );
iterator = result.iterator();
java.util.Set urlSet = new java.util.TreeSet();
while ( iterator.hasNext() ) {
String target = ( String ) iterator.next();
//-------------------------------------------------------
// 絶対パスに変換
//-------------------------------------------------------
String absPath = AbsolutePathObtainer.getAbsolutePath( new URL( urlAsString ), target );
//-------------------------------------------------------
// Setに格納して重複を取り除く
//-------------------------------------------------------
urlSet.add( absPath );
}
//-------------------------------------------------------
// IMGのURLだけコンテンツダウンロードする(複数スレッドで同時実行)
//-------------------------------------------------------
ImageDownloadManager.download( urlSet );
} catch ( Exception e ) {
e.printStackTrace();
}
end = System.currentTimeMillis();
elapsedTime = ( end - start ) ;
System.out.println( "\n経過時間: " + elapsedTime + " msec" );
}
}
■以下実行結果
$ java -cp . WebClientEmulator http://www.doblog.com/weblog/myblog/7160 UTF8
http://www.doblog.com/weblog/myblog/7160: 応答コード=200
http://www.doblog.com/img/u7160/bgthumb/BTH2527081_0B.jpg
応答コード=200
画像ファイルサイズ=9562
http://www.doblog.com/img/u7160/bgthumb/BTH2527113_0B.jpg
応答コード=200
画像ファイルサイズ=7544
http://www.doblog.com/img/u7160/bgthumb/BTH2527113_1B.jpg
応答コード=200
画像ファイルサイズ=11523
http://www.doblog.com/img/u7160/bgthumb/BTH2527113_2B.jpg
応答コード=200
画像ファイルサイズ=14088
http://www.doblog.com/img/u7160/bgthumb/BTH2527113_3B.jpg
応答コード=200
画像ファイルサイズ=10850
http://www.doblog.com/img/u7160/bgthumb/BTH2527117_0B.jpg
応答コード=200
画像ファイルサイズ=5498
http://www.doblog.com/img/u7160/bgthumb/BTH2527117_1B.jpg
応答コード=200
画像ファイルサイズ=6307
http://www.doblog.com/img/u7160/bgthumb/BTH2527117_2B.jpg
応答コード=200
画像ファイルサイズ=6614
http://www.doblog.com/img/u7160/bgthumb/BTH2527126_0B.jpg
応答コード=200
画像ファイルサイズ=11081
http://www.doblog.com/img/u7160/bgthumb/BTH2527126_1B.jpg
応答コード=200
画像ファイルサイズ=12582
http://www.doblog.com/img/u7160/bgthumb/BTH2527126_2B.jpg
応答コード=200
画像ファイルサイズ=12321
http://www.doblog.com/img/u7160/bgthumb/BTH2527126_3B.jpg
応答コード=200
画像ファイルサイズ=7894
http://www.doblog.com/img/u7160/bgthumb/BTH2527126_4B.jpg
応答コード=200
画像ファイルサイズ=12462
http://www.doblog.com/img/u7160/bgthumb/BTH2527132_0B.jpg
応答コード=200
画像ファイルサイズ=8180
http://www.doblog.com/img/u7160/bgthumb/BTH2527132_1B.jpg
応答コード=200
画像ファイルサイズ=7627
http://www.doblog.com/img/u7160/bgthumb/BTH2527885_0B.jpg
応答コード=200
画像ファイルサイズ=7573
http://www.doblog.com/img/u7160/bgthumb/BTH2527912_0B.jpg
応答コード=200
画像ファイルサイズ=6114
http://www.doblog.com/img/u7160/bgthumb/BTH2527912_1B.jpg
応答コード=200
画像ファイルサイズ=6583
http://www.doblog.com/img/u7160/bgthumb/BTH2527912_2B.jpg
応答コード=200
画像ファイルサイズ=5516
http://www.doblog.com/img/u7160/bgthumb/BTH2527912_3B.jpg
応答コード=200
画像ファイルサイズ=6188
http://www.doblog.com/img/u7160/bgthumb/BTH2527912_4B.jpg
応答コード=200
画像ファイルサイズ=4906
http://www.doblog.com/img/u7160/bgthumb/BTH2527994_0B.jpg
応答コード=200
画像ファイルサイズ=12224
http://www.doblog.com/img/u7160/bgthumb/BTH2527994_1B.jpg
応答コード=200
画像ファイルサイズ=4438
http://www.doblog.com/img/u7160/bgthumb/BTH2528075_0B.jpg
応答コード=200
画像ファイルサイズ=4558
http://www.doblog.com/img/u7160/bgthumb/BTH2528075_1B.jpg
応答コード=200
画像ファイルサイズ=6766
http://www.doblog.com/img/u7160/bgthumb/BTH2528425_0B.jpg
応答コード=200
画像ファイルサイズ=8039
完了しました!
経過時間: 3312 msec
戻る