Недопустимый начальный байт 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();
}