top / index / prev / next / target / source

2002-01-29 diary: HTTP経由ファイル取得ツール(Java版)

いがぴょんの日記 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

HTTP経由ファイル取得ツール(Java版)

昨日は午後お休みをとって父の見舞いをしてきました。

ディスプレイの明るさ

ディスプレイの明るさ調整機能が備わっていることを再発見する。で 私の目には 6500K 程度がやさしい模様。(今までは デフォルト値である 9300K を起点として、コントラストやブライトネスなどで調整していました)

HTTP経由ファイル取得

ごく簡単な 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 です。正式版のリリースも 間近ですね。 --

Merlinの新I/Oクラス

ずいぶん昔に日記MLに田中さんが流されていたメールを 今更ながら発見しました。[igapyon:00813] java.nioこんばんは、田中です。 SDC に日本語解説記事が載っていました。JSR-51 は DL したものの読んでなかった(^^;

記事の中にもありますが、現在の OS なら当然のように使える機能を Java にも持ち込んだものですね。

ここからいがぴょんいよいよ! Javaに非同期I/Oが加わるのですね。すっごく楽しみです。…しかしこれは私には難解そうだなぁ (苦笑) C言語使いだった時にも 非同期I/Oは ずいぶんと尻込みしていました。まぁ Java言語はスレッドの使い勝手が良いので、ずいぶん安心して利用できそうにも予想できます。

2002/01/30 結城浩さんからツッコミSubject: [igapyon:00883] Re: java.nio結城です。 UNIX USER(ソフトバンクパブリッシング)2002年3月号に NIOのBufferとChannelの簡単な解説記事を書きました。以上、宣伝まで。

ここからいがぴょんありがとうございます。是非 買います!!!

Excelの使い方 (苦笑)

Excel97の新しい技を身につけました。

データにどのようなデータが含まれるのかを一望するのに この技はすごく便利です。

いがぴょんは パッケージソフトウェアユーザとしては すっごくレベルが低いのであった…

(笑)

世間のニュースから () 2002


この日記について