Статьи

Значение синтаксического анализа от StreamCorruptedException: неверный заголовок потока Сообщение

Это довольно распространенное явление, когда StreamCorruptedException генерируется с «причиной», которая заявляет « недопустимый заголовок потока », а затем предоставляет первую часть этого недопустимого заголовка потока. Часто полезной подсказкой для определения причины этого исключения является понимание того, что является недопустимым заголовком потока, потому что это объясняет, что является неожиданным и вызывает проблему.

StreamCorruptedException имеет только два конструктора, один из которых не принимает аргументов, а другой принимает одну строку, описывающую «причину» исключения. Это говорит нам о том, что сообщения «недопустимый заголовок потока: XXXXXXXX» (где XXXXXXXX представляет различные сведения о недопустимом заголовке) предоставляются кодом, который создает (и предположительно StreamCorruptedException ) эти StreamCorruptedException а не самим этим классом исключений. Это означает, что это не всегда будет одно и то же отформатированное сообщение, встречающееся с одним из этих исключений, но в большинстве распространенных случаев формат совпадает с «недопустимым заголовком потока:», за которым следует первая часть этого недопустимого заголовка потока.

Это исключение обычно выдается ObjectInputStream . Javadoc для этого класса содержит некоторые полезные детали, которые помогают объяснить, почему встречается « StreamCorruptedException: неверный заголовок потока ». Javadoc уровня класса утверждает: «Только потоки, которые поддерживают интерфейс java.io.Serializable или java.io.Externalizable, могут быть прочитаны из потоков». Javadoc для конструктора ObjectInputStream (InputStream) утверждает (я добавил акцент ): «Создает ObjectInputStream, который читает из указанного InputStream . Заголовок потока сериализации читается из потока и проверяется ».

Как объясняет цитируемый Javadoc, ObjectInputStream следует использовать с сериализованными данными. Многие случаи сообщения «StreamCorruptedException: недопустимый заголовок потока» возникают, когда текстовый файл (например, HTML, XML, JSON и т. Д.) Передается в этот конструктор, а не в сериализованный файл Java.

Ниже приведены примеры значений «ASCII», полученных из сообщений «неверный заголовок потока», связанных с StreamCorruptedException и сообщаемых в режиме онлайн.

Неверное значение заголовка потока (HEX) Соответствующие целые числа соответствующий
Значение «ASCII»
Интернет ссылки / примеры
00000000 000 000 000 000 https://stackoverflow.com/questions/44479323/exception-in-thread-main-java-io-streamcorruptedexception-invalid-stream-head
0A0A0A0A 010 010 010 010 https://issues.jenkins-ci.org/browse/JENKINS-35197
0A0A3C68 010 010 060 104 https://developer.ibm.com/answers/questions/201983/what-does-javaiostreamcorruptedexception-invalid-s/
20646520 032 100 101 032 де https://stackoverflow.com/questions/2622716/java-invalid-stream-header-problem
30313031 048 049 048 049 0101 https://stackoverflow.com/questions/48946230/java-io-streamcorruptedexception-invalid-stream-header-30313031
32303138 050 048 049 056 2018 https://stackoverflow.com/questions/49878481/jpa-invalid-stream-header-32303138
3C21444F 060 033 068 079 <! DO https://github.com/metasfresh/metasfresh/issues/1335
3c48544d 060 072 084 077 <HTM http://forum.spring.io/forum/spring-projects/integration/jms/70353-java-io-streamcorruptedexception-invalid-stream-header
3C6F626A 060 111 098 106 <OBJ
3C787364 060 120 115 100 <XSD https://stackoverflow.com/questions/29769191/java-io-streamcorruptedexception-invalid-stream-header-3c787364
41434544 065 067 069 068 ACED https://stackoverflow.com/questions/36677022/java-io-streamcorruptedexception-invalid-stream-header-41434544
48656C6C 072 101 108 108 Ад https://stackoverflow.com/questions/28298366/java-io-streamcorruptedexception-invalid-stream-header-48656c6c
4920616D 073 032 097 109 я https://stackoverflow.com/questions/34435188/java-io-streamcorruptedexception-invalid-stream-header-4920616d
54656D70 084 101 109 112 температура https://stackoverflow.com/a/50669243
54657374 084 101 115 116 Тест java.io.StreamCorruptedException: неверный заголовок потока: 54657374
54686973 084 104 105 115 Этот https://stackoverflow.com/questions/28354180/stanford-corenlp-streamcorruptedexception-invalid-stream-header-54686973
64617364 100 097 115 100 DASD https://stackoverflow.com/questions/50451100/java-io-streamcorruptedexception-invalid-stream-header-when-writing-to-the-stdo?noredirect=1&lq=1
70707070 112 112 112 112 PPPP https://stackoverflow.com/questions/32858472/java-io-streamcorruptedexception-invalid-stream-header-70707070
72657175 114 101 113 117 Requ https://stackoverflow.com/questions/8534124/java-io-streamcorruptedexception-invalid-stream-header-72657175
7371007E 115 113 000 126 квадратный https://stackoverflow.com/questions/2939073/java-io-streamcorruptedexception-invalid-stream-header-7371007e
77617161 119 097 113 097 waqa https://coderanch.com/t/278717/java/StreamCorruptedException-invalid-stream-header
7B227061 123 034 112 097 { «Ра https://stackoverflow.com/questions/9986672/streamcorruptedexception-invalid-stream-header

Приведенные выше примеры показывают сообщение «StreamCorruptedException: неверный заголовок потока», возникающее в случаях, когда входные потоки, представляющие текст, были переданы в конструктор, который ожидает сериализованный формат Java. Выделенный ряд особенно интересен. Эта запись (« ACED » в символьном представлении «ASCII») выглядит так, как ожидается во всех файлах, сериализованных сериализацией Java по умолчанию , но она не совсем корректна.

Раздел « Терминальные символы и константы » Спецификации Сериализации Объекта Java говорит нам, что java.io.ObjectStreamConstants определяет константу STREAM_MAGIC, которая является «Магическим числом, которое записывается в заголовок потока». В спецификации также объясняется, что ObjectStreamConstants.STREAM_MAGIC определен как (short)0xaced и это может быть проверено в коде Java, если это необходимо. Причина того, что конкретная запись привела к ошибке, состоит в том, что это должно быть шестнадцатеричное представление, которое является «ACED», а не переведенным представлением «ASCII». Другими словами, для этого конкретного случая это был буквальный текст «ACED», который был в первых байтах, а не байты, представленные шестнадцатеричным представлением «ACED».

Существует много способов перевести шестнадцатеричное представление, представленное в сообщении «StreamCorruptedException: недопустимый заголовок потока», чтобы посмотреть, преобразуется ли оно в текст, который что-то значит. Если это текст, он знает, что он или она плохо начал, поскольку вместо текста следует использовать двоичный сериализованный файл. Символы в этом тексте могут дать дополнительную подсказку о том, какой тип текстового файла был предоставлен случайно. Вот один из способов перевода предоставленного шестнадцатеричного представления в текст «ASCII» с использованием Java ( доступно на GitHub ):

01
02
03
04
05
06
07
08
09
10
11
12
13
14
private static String toAscii(final String hexInput)
{
   final int length = hexInput.length();
   final StringBuilder ascii = new StringBuilder();
   final StringBuilder integers = new StringBuilder();
   for (int i = 0; i < length; i+=2)
   {
      final String twoDigitHex = hexInput.substring(i, i+2);
      final int integer = Integer.parseInt(twoDigitHex, 16);
      ascii.append((char)integer);
      integers.append(String.format("%03d", integer)).append(" ");
   }
   return hexInput + " ==> " + integers.deleteCharAt(integers.length()-1).toString() + " ==> " + ascii.toString();
}

Потоки текста, непреднамеренно переданные в конструктор ObjectInputStream , не являются единственной причиной «StreamCorruptedException: неверный заголовок потока». Фактически, любой InputStream (текстовый или двоичный), который не начинается с ожидаемых «магических потоков» байтов ( 0xaced ), приведет к этому исключению.

Опубликовано на Java Code Geeks с разрешения Дастина Маркса, партнера нашей программы JCG . См. Оригинальную статью здесь: Значение синтаксического анализа от StreamCorruptedException: неверный заголовок потока. Сообщение

Мнения, высказанные участниками Java Code Geeks, являются их собственными.