java 同时使用 InputStream 和 InputStreamReader

Using InputStream and InputStreamReader at the same time in java

我从一个文件创建了一个 InputStream 对象,并从中创建了一个 InputStreamReader。

InputStream ips = new FileInputStream("c:\data\input.txt");
InputStreamReader isr = new InputStreamReader(ips);

我基本上会以字节形式将数据读取到缓冲区,但是当我需要读取字符时,我会 'switch mode' 并使用 InputStreamReader

读取
byte[] bbuffer = new byte[20];
char[] cbuffer = new char[20];

while(ips.read(buffer, 0, 20)!=-1){
    doSomethingWithbBuffer(bbuffer);
    // check every 20th byte and if it is 0 start reading as char
    if(bbuffer[20] == 0){  
        while(isr.read(cbuffer, 0, 20)!=-1){
            doSomethingWithcBuffer(cbuffer);
            // check every 20th char if its # return to reading as byte
            if(cbuffer[20] == '#'){
                break;
            }
        }
    } 
}

这是一种读取混合了字符和字节数据的文件的安全方法吗?

不,这不安全。 InputStreamReader 可能会从底层流中读取 "too much" 数据(它使用内部缓冲区)并破坏您从底层字节流中读取的尝试。如果你想混合读取字符和字节,你可以使用类似 DataInputStream 的东西。

或者,只需将数据读取为字节并使用正确的字符编码将这些字节转换为 characters/Strings。