作業中のコードベースのチャンクをクリーンアップしていますが、古いクラスの 1 つがデータの読み取りと書き込みに使用されています。このデータは、US-ASCII でエンコードされた文字列とバイナリでエンコードされたプリミティブが混在しています。
現在の実装ではDataInputStreamを使用していますが、ドキュメントでわかるように、このreadLine()
メソッドはバイトから文字への変換に関連する問題のために廃止されています。このエンコーディングの問題は実際には発生していませんが、OpenJDK 7 の一部のバージョンでは既に機能せず、非推奨とは将来的に完全に削除される可能性があることを意味するため、非推奨は問題です。「公式の」代替手段は BufferedReader から使用することreadLine
です が、 BufferedReader はバイナリエンコードされたプリミティブを実際に処理できないため、 DataInputStream で完全にスワップアウトすることはできません。
これら 2 つのクラスを「混在させる」ことの問題は、BufferedReader がストリームからバッファリングするときに、ストリーム マーカーを進めることです。これはreadDouble()
、ストリーム マーカーの実際の場所が、アプリケーション ロジックのコンテキストで「あるべき」場所ではないため、DataInputStream からのようなメソッドへの後続の呼び出しが IOExceptions または EOFExceptions で失敗することを意味します。
ある種のハッキーなmark()
/戦略を調べましたが、 /reset()
をサポートしていない FileInputStream によってストリームがサポートされることがあります。mark()
reset()
データ プロトコルを変更してプリミティブを文字として書き出すか、独自の実装を作成するreadLine()
(これは驚くほど簡単ではありません) 以外に、これを達成する方法はありますか? この時点で、外部ライブラリを検討しても構わないと思います。