Я очищаю некоторые фрагменты нашей кодовой базы на работе, и один из старых классов используется для чтения и записи данных. Эти данные представляют собой смесь строк в кодировке US -ASCII и примитивов в двоичной кодировке.
Текущая реализация использует DataInputStream , но, как видно из документации, метод readLine()
устарел из-за проблемы, связанной с преобразованием байтов в символы. Хотя эта проблема с кодировкой на самом деле не возникла для нас, устаревание является проблемой, поскольку она уже не работает в какой-то версии OpenJDK 7, а устаревание означает, что в будущем она может быть полностью удалена. «Официальной» альтернативой является использование readLine
из BufferedReader , но мы не можем выполнить полную замену -с помощью DataInputStream, поскольку BufferedReader не может реально обрабатывать двоично-закодированные примитивы.
Проблема с «смешением» этих двух классов заключается в том, что когда BufferedReader буферизует поток, он перемещает маркер потока. Это означает, что последующие вызовы таких методов, как readDouble()
из DataInputStream, завершатся ошибкой с IOExceptions или EOFExceptions, поскольку реальное расположение маркера потока не там, где оно "должно" быть в контексте логики приложения.
Я изучил какую-то хакерскую стратегию mark()
/reset()
, но иногда поток поддерживается FileInputStream, который не поддерживает mark()
/reset()
.
Помимо изменения нашего протокола данных для записи примитивов в виде символов или написания моей собственной реализацииreadLine()
(что на удивление не -тривиально ), есть ли способ добиться этого? На данный момент я даже готов рассмотреть внешнюю библиотеку.