Попытка чтения с URL-адреса (на Java) в некоторых случаях приводит к бессмысленности - PullRequest
1 голос
/ 04 марта 2011

Я пытаюсь прочитать URL-адрес, а затем распечатать результат.

BufferedReader in = new BufferedReader(
     new InputStreamReader(new URL("http://somesite.com/").openStream(), "UTF-8"));
String s = "";
while ((s=in.readLine())!=null) System.out.println(s);
in.close();

Он прекрасно работает большую часть времени и печатает исходный код сайта. Однако моя проблема заключается в том, что на определенных веб-сайтах вместо исходного кода будет распечатываться тарабарщина, например символы и другие необычные символы.

Существует ли какое-либо свойство, которое варьируется от веб-сайта к веб-сайту и которое может повлиять на его чтение? Страница прекрасно загружается в Firefox, и я могу без проблем просматривать исходный код. Если Firefox может получить доступ к источнику, я тоже смогу; Я просто не уверен, почему это не работает ...

РЕДАКТИРОВАТЬ: добавлено "UTF-8" в InputStreamReader. Все странные символы теперь являются вопросительными знаками ... все еще не работают ...

Ответы [ 4 ]

2 голосов
/ 07 апреля 2016

Так что после долгих поисков я нашел ответ на этот вопрос. XML читается как бред, потому что это сжатый Gzip. Способ прочитать это с помощью GZIPInputStream. Это потому, что XML сжат по-разному.

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Accept-Encoding", "gzip");
    InputStreamReader in = new InputStreamReader (new GZIPInputStream(connection.getInputStream()));
    String str;            
    while (true) {
 int ch = in.read();
 if (ch==-1) {
    break;
 }
1 голос
/ 04 марта 2011

Попробуйте использовать telnet для диагностики того, что происходит по проводам. Это могут быть не текстовые данные. Например, что происходит, когда вы делаете это?

telnet somesite.com 80
GET / HTTP/1.0
Host: somesite.com

(после последней строки требуется два возврата каретки)

Это должно позволить вам видеть входящие заголовки и контент, а также дать вам лучшее представление о том, что происходит.

1 голос
/ 20 февраля 2012

У меня была такая же проблема, пока я не использовал HttpURLConnection с установленным setChunkedStreamingMode.

            HttpURLConnection connection = (HttpURLConnection)serverAddress.openConnection();
            connection.setRequestMethod("GET");
            connection.setDoOutput(true);
            connection.setReadTimeout(2000);
            connection.setChunkedStreamingMode(0);

            connection.connect();

            BufferedReader rd  = new BufferedReader(new InputStreamReader(connection.getInputStream()));

            String line = "";

            while ((line = rd.readLine()) != null)
            {
                sb.append(line);
            }

            System.out.println(sb.toString());
1 голос
/ 04 марта 2011

Возможно, вы столкнулись с проблемой кодировки символов.

В ответе должен быть заголовок HTTP, подобный следующему:

Content-Type: text/html; charset=UTF-8
...