Недопустимый начальный байт UTF-8 0x8b (на char #2, байт #-1)

Я пытаюсь разобрать документ атома с URL ' http://self-learning-java-tutorial.blogspot.in/atom.xml'. При синтаксическом анализе документа я получаю сообщение об ошибке "Недопустимый начальный байт UTF-8 0x8b (в char #2, байт #-1)".

Abdera abdera = new Abdera();
        Parser parser = abdera.getParser();

        URL url = new URL("http://self-learning-java-tutorial.blogspot.in/atom.xml");

        Document<Feed> doc = parser.parse(url.openStream(), url.toString());
        Feed feed = doc.getRoot();
        System.out.println(feed.getTitle());
        for (Entry entry : feed.getEntries()) {
            System.out.println("\t" + entry.getTitle());
        }
        System.out.println(feed.getAuthor());

Кто-нибудь может мне помочь, что это за ошибка и как ее устранить?

1 ответ

Решение

В ответ на этот URL-адрес приходит сжатый GZIP (у вас должно быть что-то особенное в вашей системе, так как в стандартном java 8 он не будет отправлять accept gzip по умолчанию, и для меня ваш код работает нормально).

Чтобы справиться с этим, вы можете просто распаковать поток. Обратите внимание, что для других URL вам может потребоваться обработать случай, когда ответ приходит несжатый. Кроме того, не забудьте закрыть открытые ресурсы / потоки.

Вот рабочий образец для вашего URL

    Abdera abdera = new Abdera();
    Parser parser = abdera.getParser();

    URL url = new URL(
            "http://self-learning-java-tutorial.blogspot.in/atom.xml");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestProperty("Accept-Encoding", "gzip");
    conn.connect();

    try {
        String contentEncoding = conn.getContentEncoding();
        boolean isGzip = contentEncoding != null
                && contentEncoding.contains("gzip");
        try (InputStream in = !isGzip ? conn.getInputStream()
                : new GZIPInputStream(conn.getInputStream())) {
            Document<Feed> doc = parser.parse(in, url.toString());
            Feed feed = doc.getRoot();
            System.out.println(feed.getTitle());
            for (Entry entry : feed.getEntries()) {
                System.out.println("\t" + entry.getTitle());
            }
            System.out.println(feed.getAuthor());
        }
    } finally {
        conn.disconnect();
    }
Другие вопросы по тегам