一.字节流
单个字节读取
public static void main(String[] args) {
try {
FileInputStream in = new FileInputStream("D:\\bf\\Desktop\\test.txt");//字节流
int data = in.read();
while(data != -1){
System.out.print((char)data);
data = in.read();
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
结果分析:可以看出结果出现了乱码,这是因为UTF-8文件下一个中文是两个字节,三个字节或四个字节。。。,单字节读取出现了乱码。
多个字节读取
try {
byte [] b = new byte[1024];
//System.out.print("?".getBytes("UTF-8").length);//输出4,即4个字节
FileInputStream in = new FileInputStream("D:\\bf\\Desktop\\test.txt");//字节流
//BufferedInputStream bu = new BufferedInputStream(in);//BufferedInputStream是一种封装别的流以提高效率的流,它的初始化需要一个的InputStream流对象
int n = in.read(b);
//int n = bu.read(b);
while(n != -1){
System.out.print(new String(b, 0, n));//确保输出的是每次读取的,避免上次读取的数组
对结果的影响
n = in.read(b);
//n = bu.read(b);
}
in.close();
//bu.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
结果分析:可以看出短文本能够正在显示,这是因为一次性读取完全,没有读取一个中文部分字节的情况,保持了文本的完整性。
注意:UTF-8下中文的字节长度有可能是2、3或4…若读取一个数组长度字节,很难确定长度范围,所以读取文本应尽量避免使用字节流,应使用字符流。