系列文章目录
1: Java–io流.
2: Java字节流操作文件.
3: Java 字符流复制文本文件.
5: Java 缓冲流复制文件.
一、读取无中文文本文件
1.创建文本文件
2.编写读取代码
public void fileInputStreamTest() throws IOException {
File file = null;
FileInputStream fi = null;
try {
// 1.实例化File对象,指明要读取的文件
file = new File("D:\\hello.text");
// 2.提供具体的流
fi = new FileInputStream(file);
// 3.读取数据
byte[] bytes = new byte[5];
int len;// 记录每次读取的字节的个数
while ((len = fi.read(bytes)) != -1){
String str = new String(bytes, 0, len);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
// 4.关闭输入流
if (fi != null){
fi.close();
}
}
}
程序输出如下:
很正常的输出,接下来测试一下含中文文本文件
二、读取含中文文本文件
1.创建文本文件
2.使用上面程序读取文本
先直接使用上面已写好程序,输出如下:
发现这里出现了乱码的情况。
理由:
一个中文对应两个字节存储,而英文对应一个字节存储。上面程序中读5个字节转换为字符串并打印输出,可能只读到中文的一半字节,出现乱码。
解决:
方法一:一次性读出所有字节(不推荐,但这次介绍这种方法)
方法二:使用字符流来读取文本文件(可看 Java 字符流复制文本文件.)
3.代码编写
在实例化字节数组时,一次性实例化足够大的数组
// 3.读取数据
byte[] bytes = new byte[fi.available()];// 修改了这里
输出如下:
4.总代码
public void fileInputStreamTest() throws IOException {
File file = null;
FileInputStream fi = null;
try {
// 1.实例化File对象,指明要读取的文件
file = new File("D:\\hello.text");
// 2.提供具体的流
fi = new FileInputStream(file);
// 3.读取数据
byte[] bytes = new byte[fi.available()];// 修改了这里
int len;// 记录每次读取的字节的个数
while ((len = fi.read(bytes)) != -1){
String str = new String(bytes, 0, len);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
// 4.关闭输入流
if (fi != null){
fi.close();
}
}
}