从文件中读取短裤和字符

时间:2012-12-12 09:47:08

标签: java file-io unicode

我有一个二进制文件,它是一个2字节整数和UTF-8字符对的列表。我正在做的是

InputStream stream = ...;
InputStreamReader in = new InputStreamReader(stream);

while(...){
   stream.read(...);
   in.read();
}

也就是说,我直接从InputStream读取字节,并从同一文件流的InputStreamReader中读取字符。这看起来像是一个奇怪的(可怕的?)想法,但我没有看到另一种方式。 DataInputStream只会读取UTF-16字符,我不知道我的UTF-8 char将从字节中读取多少字节(我不想重新发送InputStreamReader)。此外,相同的方案适用于输出。

我的问题是,在读完第一对后,InputStream.read返回-1(当然,文件比这长)。

我想知道是否有更好的替代方案,或者是否有其他原因导致EOF。另外,如果这个方案没问题,我应该关闭Reader还是InputStream?

1 个答案:

答案 0 :(得分:1)

你是对的,你不想同时访问InputStreamReader和它的底层InputStream。您可能必须编写自己的InputStreamReader版本,但写起来并不是很多:

byte[] bytes = new byte[4];

DataInputStream dataStream = new DataInputStream(stream);
while (dataStream.available() > 0) {
    int intValue = dataStream.readUnsignedShort();

    int charValue;
    int b = dataStream.read();
    if (b < 0x80) {
        charValue = b;
    }
    else {
        int byteCount;
        if (b >= 0xf0) {
            byteCount = 4;
        } else if (b >= 0xe0) {
            byteCount = 3;
        } else {
            byteCount = 2;
        }

        bytes[0] = (byte) b;
        dataStream.readFully(bytes, 1, byteCount - 1);
        String s = new String(bytes, 0, byteCount, 
            StandardCharsets.UTF_8);
        charValue = s.codePointAt(0);
    }

    // Do something with intValue and charValue
}