1

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

我设法通过给所有字符串一个 16 个字符的固定长度来解决这个问题,所以如果我有“狗”这个词,那么 RAF 中的这个词是“狗”(狗 + 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 个字节组成。字符长度仍然相同 - 16,但有 17 个字节,整个事情都崩溃了。

我能做些什么?

4

1 回答 1

1

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

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

这是否与您文件中存储的内容相匹配?(您尚未指定有关文件格式的任何内容。)

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

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

于 2012-12-07T16:34:38.597 回答