3

URL 接続から HTML コードを読み込もうとしています。あるケースでは、私が読もうとしている html ファイルには、実際のドキュメント タイプ宣言の前に 5 つの改行が含まれています。この場合、入力リーダーは EOF の例外をスローします。

URL pageUrl = 
    new URL(
        "http://www.nytimes.com/2011/03/15/sports/basketball/15nbaround.html"
    );

URLConnection getConn = pageUrl.openConnection();
getConn.connect();
DataInputStream dis = new DataInputStream(getConn.getInputStream());
//some read method here

誰もこのような問題に遭遇しましたか?

URL pageUrl = new URL("http://www.nytimes.com/2011/03/15/sports/basketball/15nbaround.html");
URLConnection getConn = pageUrl.openConnection();
getConn.connect();
DataInputStream dis = new DataInputStream(getConn.getInputStream());
String urlData = "";
while ((urlData = dis.readUTF()) != null)
    System.out.println(urlData);

//例外がスローされました

java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) での java.io.EOFException java.io.DataInputStream.readUTF(DataInputStream.java:572) での java.io.DataInputStream.readUTF(DataInputStream.java:547)

bufferedreader の場合、null を返すだけで続行しません。

pageUrl = new URL("http://www.nytimes.com/2011/03/15/sports/basketball/15nbaround.html");
URLConnection getConn = pageUrl.openConnection();
getConn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(getConn.getInputStream()));
String urlData = "";
while(true)
     urlData = br.readLine();
     System.out.println(urlData);

null を出力する

4

3 に答える 3

1

DataInputStreamを使用してエンコードされていないデータを読み取るために使用していDataOutputStreamます。DataInputStream#readUtf();への呼び出しについて、文書化された動作を調べます。最初に 2 バイトを読み取って 16 ビット整数を形成し、UTF でエンコードされた文字列を構成する後続のバイト数を示します。HTTP サーバーから読み取っているデータは、この形式でエンコードされていません。

代わりに、HTTP サーバーは、 RFC 2616セクション 6.1 および 2.2に従って、ASCII でエンコードされたヘッダーを送信しています。ヘッダーをテキストとして読み取り、メッセージ本文 (「エンティティ」) がどのようにエンコードされているかを判断する必要があります。

于 2011-03-20T22:52:46.687 に答える
1

これはうまくいきます:

package url;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;

/**
 * UrlReader
 * @author Michael
 * @since 3/20/11
 */
public class UrlReader
{

    public static void main(String[] args)
    {
        UrlReader urlReader = new UrlReader();

        for (String url : args)
        {
            try
            {
                String contents = urlReader.readContents(url);
                System.out.printf("url: %s contents: %s\n", url, contents);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }


    public String readContents(String address) throws IOException
    {
        StringBuilder contents = new StringBuilder(2048);
        BufferedReader br = null;

        try
        {
            URL url = new URL(address);
            br = new BufferedReader(new InputStreamReader(url.openStream()));
            String line = "";
            while (line != null)
            {
                line = br.readLine();
                contents.append(line);
            }
        }
        finally
        {
            close(br);
        }

        return contents.toString();
    }

    private static void close(Reader br)
    {
        try
        {
            if (br != null)
            {
                br.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}
于 2011-03-20T23:01:25.787 に答える
0

これ:

public class Main {
    public static void main(String[] args) 
        throws MalformedURLException, IOException 
    {
        URL pageUrl = new URL("http://www.google.com");
        URLConnection getConn = pageUrl.openConnection();
        getConn.connect();
        BufferedReader dis = new BufferedReader( 
                                 new InputStreamReader(
                                     getConn.getInputStream()));
        String myString;
        while ((myString = dis.readLine()) != null)
        {
            System.out.println(myString);
        }
    }
}

完璧に動作します。ただし、指定した URL は何も返しません。

于 2011-03-20T22:50:42.747 に答える