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。
我从一个文件创建了一个 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。