private MappedByteBuffer m_mbBuf = null;//将指定路径的文本读取到MappedByteBuffer的对象m_mbBuf里
public void openbook(String strFilePath) throws IOException {
book_file = new File(strFilePath);
long lLen = book_file.length();
m_mbBufLen = (int) lLen;
m_mbBuf = new RandomAccessFile(book_file, "r").getChannel().map(
FileChannel.MapMode.READ_ONLY, 0, lLen);
}

//猜测是对读取到的m_mbBuf对象进行解码
protected byte[] readParagraphBack(int nFromPos) {
int nEnd = nFromPos;
int i;
byte b0, b1;
if (m_strCharsetName.equals("UTF-16LE")) {
i = nEnd - 2;
while (i > 0) {
b0 = m_mbBuf.get(i);
b1 = m_mbBuf.get(i + 1);
if (b0 == 0x0a && b1 == 0x00 && i != nEnd - 2) {
i += 2;
break;
}
i--;
} } else if (m_strCharsetName.equals("UTF-16BE")) {
i = nEnd - 2;
while (i > 0) {
b0 = m_mbBuf.get(i);
b1 = m_mbBuf.get(i + 1);
if (b0 == 0x00 && b1 == 0x0a && i != nEnd - 2) {
i += 2;
break;
}
i--;
}
} else {
i = nEnd - 1;
while (i > 0) {
b0 = m_mbBuf.get(i);
if (b0 == 0x0a && i != nEnd - 1) {
i++;
break;
}
i--;
}
}
if (i < 0)
i = 0;
int nParaSize = nEnd - i;
int j;
byte[] buf = new byte[nParaSize];
for (j = 0; j < nParaSize; j++) {
buf[j] = m_mbBuf.get(i + j);
}
return buf;
} //猜测是对读取到的m_mbBuf对象进行解码
protected byte[] readParagraphForward(int nFromPos) {
int nStart = nFromPos;
int i = nStart;
byte b0, b1;
//鏍规嵁缂栫爜鏍煎紡鍒ゆ柇鎹㈣
if (m_strCharsetName.equals("UTF-16LE")) {
while (i < m_mbBufLen - 1) {
b0 = m_mbBuf.get(i++);
b1 = m_mbBuf.get(i++);
if (b0 == 0x0a && b1 == 0x00) {
break;
}
}
} else if (m_strCharsetName.equals("UTF-16BE")) {
while (i < m_mbBufLen - 1) {
b0 = m_mbBuf.get(i++);
b1 = m_mbBuf.get(i++);
if (b0 == 0x00 && b1 == 0x0a) {
break;
}
}
} else {
while (i < m_mbBufLen) {
b0 = m_mbBuf.get(i++);
if (b0 == 0x0a) {
break;
}
}
}
int nParaSize = i - nStart;
byte[] buf = new byte[nParaSize];
for (i = 0; i < nParaSize; i++) {
buf[i] = m_mbBuf.get(nFromPos + i);
}
return buf;
}
求大神指导第二三个方法的解释

解决方案 »

  1.   

    2个方法差不多,一个是向前找,一个是向后找
    以向前找为例:
    int nEnd = nFromPos;确定最后的终点
    然后根据UTF-16LE UTF-16BE确定查找的内容  前者是0x0a ox00  后者是0x00 0x0a 即查找符合相同内容的相邻2个字节   注意是找最近的一个 且不是最后的终点 然后得到i += 2;break;
    根据这段代码,大概可以知道 这个UTF-16LE UTF-16BE什么玩意将文件内容给隔开了
    然后根据i来计算返回的数据
    if (i < 0)
    i = 0;
    int nParaSize = nEnd - i;
    int j;
    byte[] buf = new byte[nParaSize];
    for (j = 0; j < nParaSize; j++) {
    buf[j] = m_mbBuf.get(i + j);
    }
    return buf;
    }
    即返回从i开始(i< 0表示没找到0x0a0x00)的 nEnd - i个字节,i就是第一个满足条件的index,所以很明确,就是返回用0x0a0x00标记为起点的到传入的end的字节数组后一个类似  就是从传入的起点向后找
      

  2.   

    忘了说了  不是UTF-16LE UTF-16BE的话  就查找0x0a  逻辑很清晰的  多推敲下吧