top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
昨日は午後お休みをとって父の見舞いをしてきました。
ディスプレイの明るさ調整機能が備わっていることを再発見する。で 私の目には 6500K 程度がやさしい模様。(今までは デフォルト値である 9300K を起点として、コントラストやブライトネスなどで調整していました)
ごく簡単な HTTP経由ファイル取得ツール (Java版) HttpGet.java
/**
* HTTP受信サンプルプログラム
* Copyright (C) 2002 Tosiki IGA
*
* @author Tosiki IGA
* @version 2002.01.29
* (http://homepage2.nifty.com/igat/igapyon/index.html)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;
public class HttpGet
{
private static final long LAZY_MILLISEC_PAR_RECV=100;
private static final int REPORT_PER_DIFF=2;
private static final int BLOCK_SIZE=1024;
private int iTotalLength=(-1);
private int iCurrentLength=0;
private long lStartTime=0;
private long lEndTime=0;
private NumberFormat numFormat=NumberFormat.getNumberInstance();
private SimpleDateFormat sdFormat=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
private String strTargetFileName=null;
public static final void main(String[] args)
{
System.out.println("HttpGet (0.3)");
if(args.length==0){
System.out.println();
System.out.println("Usage:");
System.out.println(" java HttpGet [取得URI]");
System.out.println(" ex. java HttpGet http://homepage2.nifty.com/igat/igapyon/index.html");
}else{
try{
new HttpGet().get(args[0]);
}catch(IOException ex){
System.out.println(ex.toString());
ex.printStackTrace();
}catch(InterruptedException ex){
System.out.println(ex.toString());
ex.printStackTrace();
}
}
}
/**
* HTTPを利用してファイルを取得します
*/
public void get(String strUrl)
throws IOException,InterruptedException
{
URL url=new URL(strUrl);
URLConnection conn=url.openConnection();
File fileWrite=getRecvFile(url);
iTotalLength=conn.getContentLength();
lStartTime=System.currentTimeMillis();
getFile(conn,fileWrite);
lEndTime=System.currentTimeMillis();
afterCheck(conn,fileWrite);
}
/**
* ファイル受信の主処理
*/
private void getFile(URLConnection conn,File fileWrite)
throws IOException,InterruptedException
{
int iPastLength=0;
int iPastProgress=0;
BufferedInputStream inStream=new BufferedInputStream(conn.getInputStream());
BufferedOutputStream outStream=new BufferedOutputStream(new FileOutputStream(fileWrite));
long lPastTime=System.currentTimeMillis();
System.out.println("HTTP受信遅延ミリ秒: "+LAZY_MILLISEC_PAR_RECV);
byte[] byteRead=new byte[BLOCK_SIZE];
for(;;){
int iReadLen=inStream.read(byteRead);
if(iReadLen==(-1)){
break;
}
outStream.write(byteRead,0,iReadLen);
iCurrentLength+=iReadLen;
int iCurrentProgress=iCurrentLength*100/iTotalLength;
if(iCurrentProgress>iPastProgress+(REPORT_PER_DIFF-1)){
long lCurrentTime=System.currentTimeMillis();
System.out.println(sdFormat.format(new Date())+" "+iCurrentProgress+"% "
+numFormat.format(iCurrentLength)+" bytes 効率:"
+numFormat.format((iCurrentLength-iPastLength)*1000/(lCurrentTime+1-lPastTime))+" bytes/sec");
iPastLength=iCurrentLength;
iPastProgress=iCurrentProgress;
lPastTime=lCurrentTime;
}
// 遅延
Thread.sleep(LAZY_MILLISEC_PAR_RECV);
}
outStream.flush();
outStream.close();
inStream.close();
}
/**
* HTTP受信の前処理。受信ファイル名を決定し、そのファイル名のFileオブジェクトを返します。
*/
private final File getRecvFile(URL url)
{
strTargetFileName=url.getPath();
int iLast=strTargetFileName.lastIndexOf('/');
if(iLast!=(-1)){
strTargetFileName=strTargetFileName.substring(iLast+1);
}
System.out.println("受信ファイル名:"+strTargetFileName);
return new File(strTargetFileName+".tmp");
}
/**
* HTTP受信の後処理
*/
private boolean afterCheck(URLConnection conn,File fileWrite)
{
if(iTotalLength!=(-1)
&& iTotalLength!=iCurrentLength){
System.out.println("エラー: 受信ファイルの長さ不一致");
return false;
}else{
if(conn.getLastModified()>0){
fileWrite.setLastModified(conn.getLastModified());
}
System.out.println(numFormat.format(iTotalLength)+" bytes in "
+numFormat.format((lEndTime-lStartTime)/1000)+" sec 転送効率: "
+numFormat.format(iTotalLength*1000/(lEndTime-lStartTime))+" byte/sec");
}
File fileTarget=new File(strTargetFileName);
fileTarget.delete();
fileWrite.renameTo(fileTarget);
return true;
}
}
関連する日記
昨日、父の見舞いをしてきました。父は 点滴もとれて とりあえず脳梗塞の初期の治療は落ち着いてきた模様です。まずは一安心と言うところでしょうか。で、私単体でも、少しずつ平静を取り戻しつつ…。今週は 静岡出張1回だけだしそろそろ平常状態に戻りつつあります。(日記がつけられる状態にまで少しずつ復元しつつあります :-P
で 今日 電話で聞いたところによると、血管造影撮影を無事終了できた模様です。撮影の結果、頸動脈の1つが 90%詰まっていたとのこと。併せて 今回の脳梗塞の詳細について 今週の土曜日に聞きに行くスケジュールを得ました。病院に感謝。
大村忠史さんからツッコミただ今、開発中の Javaの メジャーバージョンアップ である Java2 SE v1.4 の Release Candidate が 公開されました。
日本語の説明文のページも 今朝見てみたら、Release Candidate に ちゃんと更新されていました。
インストール後、 java -version を実行すると、 java version "1.4.0-rc" Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91) Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)と、表示されます。 1.4 beta2 は、b74 で、1.4 beta3 は、b84 でしたが、1.4 RC1 は、b91 です。正式版のリリースも 間近ですね。 --
ずいぶん昔に日記MLに田中さんが流されていたメールを 今更ながら発見しました。[igapyon:00813] java.nioこんばんは、田中です。 SDC に日本語解説記事が載っていました。JSR-51 は DL したものの読んでなかった(^^;
記事の中にもありますが、現在の OS なら当然のように使える機能を Java にも持ち込んだものですね。
非ブロック入出力 ・・・ 欲しかった!
メモリーマップファイル ・・・ R/W バッファーのコピーが無くなりパフォーマンス向上する。Mach が最初? Unix に持ち込んだのは Sun
ここからいがぴょんいよいよ! Javaに非同期I/Oが加わるのですね。すっごく楽しみです。…しかしこれは私には難解そうだなぁ (苦笑) C言語使いだった時にも 非同期I/Oは ずいぶんと尻込みしていました。まぁ Java言語はスレッドの使い勝手が良いので、ずいぶん安心して利用できそうにも予想できます。
2002/01/30 結城浩さんからツッコミSubject: [igapyon:00883] Re: java.nio結城です。 UNIX USER(ソフトバンクパブリッシング)2002年3月号に NIOのBufferとChannelの簡単な解説記事を書きました。以上、宣伝まで。
ここからいがぴょんありがとうございます。是非 買います!!!
Excel97の新しい技を身につけました。
CTRL+A で全てのセルを選択する
データ(D) → フィルタ(F) → オートフィルタ(F)
データにどのようなデータが含まれるのかを一望するのに この技はすごく便利です。
(笑)