从StreamCorruptedException解析值:无效的流头消息
看到StreamCorruptedException拋出“原因”并指出“ 無效流頭 ”,然后提供該無效流頭的第一部分是相對常見的情況。 通常,確定異常原因的有用線索是了解無效流頭是什么,因為這可以解釋意外的原因并引起問題。
StreamCorruptedException只有兩個構造函數, 一個不接受任何參數 , 一個接受單個描述異常原因的String 。 這告訴我們,“無效流頭:XXXXXXXX”消息(其中XXXXXXXX表示各種無效的頭詳細信息)由實例化(并可能拋出)這些StreamCorruptedException的代碼提供,而不是由該異常類本身提供。 這意味著,遇到這些異常之一時,不一定總是遇到相同格式的消息,但是在大多數情況下,格式與“ invalid stream header:”無效,后跟該無效流頭的第一部分。
通常由ObjectInputStream拋出此異常。 該類的Javadoc包含一些有用的詳細信息,有助于解釋為什么遇到“ StreamCorruptedException:invalid stream header ”。 類級別的Javadoc指出:“只能從流中讀取支持java.io.Serializable或java.io.Externalizable接口的對象?!?ObjectInputStream(InputStream)構造函數的Javadoc聲明(我強調說 ) ``創建一個從指定InputStream讀取的ObjectInputStream 。 從流中讀取并驗證序列化流頭 ?!?
正如引用的Javadoc所解釋的, ObjectInputStream應該與序列化數據一起使用。 當文本文件(例如HTML,XML,JSON等)傳遞給此構造函數而不是Java序列化文件時,會發生“ StreamCorruptedException:無效的流頭”消息的許多情況。
以下是從與StreamCorruptedException相關聯的“無效流頭”消息派生并在線報告的“ ASCII”值示例。
| 00000000 | 000 000 000 000 | https://stackoverflow.com/questions/44479323/exception-in-thread-main-java-io-streamcorruptedexception-invalid-stream-head | |
| 0A0A0A0A | 010010010010 | https://issues.jenkins-ci.org/browse/JENKINS-35197 | |
| 0A0A3C68 | 010010060104 | <h | https://developer.ibm.com/answers/questions/201983/what-does-javaiostreamcorruptedexception-invalid-s/ |
| 20646520 | 032100101032 | 德 | 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 | 060111098106 | <obj | |
| 3C787364 | 060120115100 | <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 101109112 | 溫度 | https://stackoverflow.com/a/50669243 |
| 54657374 | 084 101115116 | 測試 | java.io.StreamCorruptedException:無效的流頭:54657374 |
| 54686973 | 084 104105115 | 這個 | https://stackoverflow.com/questions/28354180/stanford-corenlp-streamcorruptedexception-invalid-stream-header-54686973 |
| 64617364 | 100097115100 | s | https://stackoverflow.com/questions/50451100/java-io-streamcorruptedexception-invalid-stream-header-when-writing-to-the-stdo?noredirect=1&lq=1 |
| 70707070 | 112112112112 | pppp | https://stackoverflow.com/questions/32858472/java-io-streamcorruptedexception-invalid-stream-header-70707070 |
| 72657175 | 114101113117 | 要求 | https://stackoverflow.com/questions/8534124/java-io-streamcorruptedexception-invalid-stream-header-72657175 |
| 7371007E | 115113 000126 | 平方? | https://stackoverflow.com/questions/2939073/java-io-streamcorruptedexception-invalid-stream-header-7371007e |
| 77617161 | 119097113097 | 瓦卡 | https://coderanch.com/t/278717/java/StreamCorruptedException-invalid-stream-header |
| 7B227061 | 123034112097 | {“ pa | https://stackoverflow.com/questions/9986672/streamcorruptedexception-invalid-stream-header |
上面的示例顯示了“ StreamCorruptedException:無效流頭”消息,該消息發生在表示文本的輸入流傳遞給期望Java序列化格式的構造函數的情況下。 突出顯示的行特別有趣。 該條目(“ ASCII”字符表示形式的“ ACED ”)看起來像通過Java的默認序列化序列化的所有文件中所期望的一樣,但這并不完全正確。
Java Object Serialization Specification的“ Terminal Symbols and Constants ”部分告訴我們, java.io.ObjectStreamConstants定義了一個常量STREAM_MAGIC ,它是“寫入流頭的幻數”。 該規范進一步解釋了ObjectStreamConstants.STREAM_MAGIC被定義為(short)0xaced并且可以根據需要在Java代碼中進行驗證。 特定條目導致錯誤的原因是它應該是“ ACED”的十六進制表示,而不是轉換后的“ ASCII”字符表示。 換句話說,對于該特定情況,實際上是文字文本“ ACED”在前一個字節中,而不是十六進制“ ACED”表示形式所表示的字節。
有多種方法可以轉換“ StreamCorruptedException:無效流頭”消息中提供的十六進制表示,以查看其是否轉換為表示某些含義的文本。 如果它是文本,則知道他或她已經處于一個糟糕的開端,因為應該使用二進制序列化文件代替文本。 該文本中的字符可以提供有關意外提供哪種類型的文本文件的進一步線索。 這是使用Java( 可在GitHub上 )將提供的十六進制表示形式轉換為“ ASCII”文本的一種方法:
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:無效的流頭”的唯一原因。 實際上,任何不以預期的“流魔術”字節( 0xaced )開頭的InputStream (文本或二進制)都將導致此異常。
翻譯自: https://www.javacodegeeks.com/2019/01/value-streamcorruptedexception-invalid-stream.html
總結
以上是生活随笔為你收集整理的从StreamCorruptedException解析值:无效的流头消息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sparklens:Spark应用程序优
- 下一篇: 思特威推出两颗高分辨率高速工业CMOS图