質問は非常に曖昧かもしれません。ここで説明させてください。ファイルからデータを読み取るアプリケーションを開発しています。次の方法でファイルを開く FileReader クラスがあります
currentFileStream = new FileInputStream(currentFile);
fileChannel = currentFileStream.getChannel();
データは次のように読み取られます
bytesRead = fileChannel.read(buffer); // Data is buffered using a ByteBuffer
私は2つの形式のいずれかでデータを処理しています。1つはバイナリで、もう1つは文字です。文字として処理された場合、この ByteBuffer を CharBuffer にデコードする追加の手順を実行します
CoderResult result = decoder.decode(byteBuffer, charBuffer, false);
今私の問題は、アプリケーションで障害やクラッシュが発生した場合に備えて、リカバリモード中にオフセットからファイルを再配置して読み取る必要があることです。
このために、バイナリ モードで処理されたバイト数を追跡する byteOffset を維持し、この変数を永続化します。
何かが起こった場合、このようにファイルの位置を変更します
fileChannel.position(byteOffset);
これは非常に簡単です。
ただし、処理モードが文字の場合、ファイル内の文字位置/オフセットを追跡する recordOffset を維持します。回復中、recordOffset+1 で保持される文字オフセットを取得するまで、内部で read() を呼び出します。
文字をデコードするために必要な対応するバイトを取得する方法はありますか? たとえば、recordOffset が 400 で、対応する byteOffset が 410 または 480 の場合 (異なる文字セットを考慮して)、このようなものが必要です。再配置中にこれを行うことができるように
fileChannel.position(recordOffset); //recordOffset equivalent value in number of bytes
アプリケーションで内部的に繰り返し呼び出しを行う代わりに。これについて私が考えることができる他のアプローチは、InputStreamReader のスキップ メソッドを使用することでした。
これに対するより良いアプローチがある場合、または可能であればバイト - 文字マッピングを取得する方法がある場合は、お知らせください。