问题可能比较模糊,我在这里解释一下。我正在开发一个应用程序,我将从文件中读取数据。我有一个 FileReader 类,它以下列方式打开文件
currentFileStream = new FileInputStream(currentFile);
fileChannel = currentFileStream.getChannel();
数据读取如下
bytesRead = fileChannel.read(buffer); // Data is buffered using a ByteBuffer
我正在以两种形式中的任何一种处理数据,一种是二进制,另一种是字符。如果它作为字符处理,我会执行一个额外的步骤,将这个 ByteBuffer 解码为 CharBuffer
CoderResult result = decoder.decode(byteBuffer, charBuffer, false);
现在我的问题是我需要通过在恢复模式期间从某个偏移量重新定位文件来读取,以防应用程序出现故障或崩溃。
为此,我维护了一个 byteOffset 来跟踪在二进制模式下处理的字节数,并且我保留了这个变量。
如果发生任何事情,我会像这样重新定位文件
fileChannel.position(byteOffset);
这很简单。
但是如果处理模式是字符,我会维护 recordOffset 来跟踪文件中的字符位置/偏移量。在恢复期间,我在内部调用 read() 直到我得到一些字符偏移量,该偏移量是持久的 recordOffset+1。
无论如何要获得解码字符所需的相应字节吗?例如,如果 recordOffset 为 400 并且其对应的 byteOffset 为 410 或 480 (考虑不同的字符集),我想要类似的东西。这样在重新定位时我可以做到这一点
fileChannel.position(recordOffset); //recordOffset equivalent value in number of bytes
而不是在我的应用程序内部进行重复调用。我能想到的其他方法是使用 InputStreamReader 的 skip 方法。
如果有任何更好的方法或者如果可能获得字节 - 字符映射,请告诉我。