我有一个二进制文件,它是一个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?
答案 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
}