随机访问文件和Java中的额外ASCII字符

时间:2012-12-07 16:29:24

标签: java ascii polish randomaccessfile

我有一个随机访问文件填充了字符串(我知道它们不是真正的字符串,虽然它会帮助我解释这个问题)。我想要做的是查看某个String,比方说String#4。虽然它对于整数和一般原始数据类型来说很简单,因为它们具有固定的字节长度,并且我可以通过总结所有先前的字节来读取正确的字节。

我设法通过给所有字符串固定长度为16个字符来解决这个问题,所以如果我有单词“dog”,那么RAF中的这个单词是“dog”(dog + 13个空格)和字节长度也是固定的。同样,我可以使用以下方法轻松读取正确的值:

static String loadOne(int n) throws IOException {
    raf = new RandomAccessFile(file, "rw");
    raf.seek((n-1)*(fix+2));
    String x = raf.readUTF();
    return x;
}

其中 n 是我想要读取的值的编号, fix 是一个字符串的字符数(和字节数)。

在我使用其中一个字符串中的额外ASCII字符(抛光字母)之前,一切似乎都很好,因为它包含2个字节。 char lenght仍然是相同的--16,但是有17个字节,整个事情崩溃了。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

我强烈怀疑你没有按照预期的方式使用readUTF。你有没读过它的作用呢?

  

从当前文件指针开始读取前两个字节,就像readUnsignedShort一样。此值给出编码字符串中的后续字节数,而不是结果字符串的长度。然后将以下字节解释为以修改的UTF-8格式编码字符的字节,并将其转换为字符。

这与您文件中存储的内容相匹配吗? (您尚未指定文件格式。)

鉴于UTF-8不是固定宽度,它听起来不适合您的场景。

我建议每个条目使用32个字节,这将始终提供16个char值作为UTF-16代码单元。您可以使用new String(data, "UTF-16BE")text.getBytes("UTF-16BE")非常简单地转换(如果需要,可以使用LE代替BE)。这样,就字节而言,你将拥有一个真正固定长度的字符串,而不仅仅是字符。