Чтение из URL соединения Java - PullRequest
3 голосов
/ 21 марта 2011

Я пытаюсь прочитать HTML-код из URL-соединения.В одном случае 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.EOFException at java.io.DataInputStream.readUnsignedShort (DataInputStream.java:323) в java.io.DataInputStream.readUTF (DataInputStream.java:572) в java.io.DataInputStream.readUTF (DataInputStream.java:547)

вв случае с буферизованным ридером, он просто отвечает нулем и не продолжает

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);

выводит ноль

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Вы используете DataInputStream для чтения данных, которые не были закодированы с использованием DataOutputStream.Изучите задокументированное поведение вашего звонка на DataInputStream#readUtf(); сначала он читает два байта , чтобы сформировать 16-разрядное целое число, указывающее число следующих байтов, составляющих строку в кодировке UTF.Данные, которые вы читаете с сервера HTTP, не кодируются в этом формате.

Вместо этого сервер HTTP отправляет заголовки, закодированные в формате ASCII, в соответствии с RFC 2616 разделы 6.1 и 2.2.Вы должны прочитать заголовки как текст, а затем определить, как кодируется тело сообщения («сущность»).

1 голос
/ 21 марта 2011

Это прекрасно работает:

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();
        }
    }
}
0 голосов
/ 21 марта 2011

Это:

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 ничего не возвращает.

...