スポンサーリンク

| キーワード:

javaでWebから.htmlを取得する

 

 

import java.io.IOException;
import java.net.URL;
import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.List;
import java.io.BufferedInputStream;

public class GetWave
{
    public static void main( String[] args )
    {
        HttpURLConnection httpURLConnection = null;
        try
        {

            URL url = new URL( "https://suzulang.com/" );

            httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setRequestMethod( "GET" );

            String ContentType = httpURLConnection.getHeaderField("Content-Type") ;
            String[] cts = ContentType.split("[;/= ]");
/*
↑ HTTPレスポンスヘッダのContent-Typeを取得する。
Content-Type: text/html; charset=shift_jis
のような形をしているので、各特殊記号とスペースを区切り文字としてsplitして、
charsetの次に入っているのが文字列と判断。(↓コード)
ただし、Content-Type: text/html;で終わっている場合もある。
*/

            //文字コードの判別
            String CharSet = null;
            for( int i = 0; i < cts.length; i++){
                if( cts[i].toLowerCase().equals("charset") ){
                    if( i+1 == cts.length ){
                        CharSet = null;
                    }
                    else{
                        CharSet = cts[i+1];
                    }
                }
            }
            if( CharSet == null ){ //文字コード指定がなかったらとりあえずUTF-8にする
                CharSet = "UTF-8";
            }

/*
ただのInputStreamはreadする度に読みに行くので効率が悪いらしい。
BufferedInputStreamは一度のアクセスで大量のデータを取得する
htttp://e-class.center.yuge.ac.jp/jdk_docs/ja/api/java/io/BufferedInputStream.html
*/
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream() );

            List<Byte> alldata = new ArrayList<Byte>();
            //HTML取得
            byte [] buf = new byte[1024*4];
            int readsize;
            while( ( readsize = bis.read(buf) ) >= 0 ){
                for(int i = 0; i < readsize; i++){
                    alldata.add( buf[i] );
                }
            }
            
            //バイトの配列に変換
            byte tostr[] = new byte[ alldata.size() ];
            for(int i = 0; i < alldata.size(); i++){
                tostr[i] = alldata.get(i);
            }
            
/*
Stringはコンストラクタで文字コードを指定できる。
String(byte[] , Charset)の場合、byteの中の文字コードがCharsetであることを示す。結果、
resultにはUTF-8に変換された文字列が入る。
*/
            //表示
            String result = new String(tostr, CharSet);
            System.out.println(result);
            
        }
        catch( IOException e )
        {
            e.printStackTrace();
        }
        finally
        {
            if( httpURLConnection != null )
            {
                httpURLConnection.disconnect();
            }
        }
        
    }
} 

 

コンパイル:

>javac GetWave.java

実行

>java GetWave

 

参考文献:

http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000803.html

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: