输入流FileInputStream和FileReader的理解
查看API我们发现,针对文件的读入有三种方法,分别是read(),read(byte[] bytes)和
read(bytes,0,bytes.length)三种方法。
三种方法的讲解
read():
1.读取内容:一次读取流中的字节
2.返回值:返回的是字节的(-128~127)内的字节值
3.读一个下次就自动跳到下一个,如果碰到-1说明没有值了.
public static void main(String[] args) {
File file = new File("E:/data/rubbish/test.txt");
try {
FileInputStream fs = new FileInputStream(file);
int tmp;
while ((tmp = fs.read()) != -1){
System.out.print((char)tmp);
}
fs.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
结果如下
<!DOCHTML html>
<html>
<head>
<meta charset="utf-8">
<title>"èœé¸Ÿæ•™ç¨‹"</title>
</head>
<body>
<h1>我的第一个demo</h1>
<p>我的第一个段è½</p>
</body>
</html>
不难发现,这种方法无法处理汉字,因为汉字为char类型(两个字节),而这种读取方式是按一个字节读取的。
read(byte[] bytes):
1.读取内容:从读取流中读取一定数量的字节
2.返回值:读入缓冲区的字节总数,这里缓冲区可以理解为字节数组。
3.如果因为已经到达文件末尾而没有更多的数据,则返回 -1。
public static void main(String[] args) {
File file = new File("E:/data/rubbish/test.txt");
try {
FileInputStream fs = new FileInputStream(file);
byte[] bytes = new byte[100];
int tmp;
while ((tmp = fs.read(bytes)) != -1){
System.out.println(new String(bytes));
bytes = new byte[100];//清空数组,重新赋值
}
fs.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
打印结果:
<!DOCHTML html>
<html>
<head>
<meta charset="utf-8">
<title>"菜鸟教程"</title>
</head>
<bo
dy>
<h1>我的第一个demo</h1>
<p>我的第一个段落</p>
</body>
</html>
不难发现,效率会比上一个方法高,但是对于汉字的处理仍然存在问题,当数组的最后一个字符刚好读到汉字时,就会出现问题,可以把数组长度变小自行测试。
read(bytes,off ,bytes.len)
1.参数
bytes- 存储读取数据的缓冲区。
off - 目标数组 b 中的起始偏移量。
len - 读取的最大字节数。
2.返回值:读入缓冲区的字节总数,如果因为已经到达文件末尾而没有更多的数据,则返回 -1
用法与第二种读取方式类似,只是能够动态限制读取文档的长度。
FileReader的讲解
FileReader 用于读取字符流
这里面同样包含了三个方法
read()
1.读取单个字符。在字符可用、发生 I/O 错误或者已到达流的末尾前,此方法一直阻塞。
用于支持高效的单字符输入的子类应重写此方法。
2.作为整数读取的字符,范围在 0 到 65535 之间 ( 0x00-0xffff),如果已到达流的末尾,则返回 -1
read(char[] cbuf)
1参数:cbuf - 目标缓冲区
2返回值:读取的字符数,如果已到达流的末尾,则返回 -1
read(char[] cbuf,int off, int len)
1.参数:
cbuf - 目标缓冲区
off - 开始存储字符处的偏移量
len - 要读取的最多字符数
2.返回:读取的字符数,如果已到达流的末尾,则返回 -1
可以理解为字符流多用于处理汉字类型的文本,而不能处理音频,视频类文件。但是字节流可以处理。
最后补充一个BufferedReader包装类的用法
public static void main(String[] args) {
File file = new File("E:/data/rubbish/test.txt");
try {
FileReader fr = new FileReader(file);
BufferedReader br = new BufferedReader(fr);
String str = "";
while ((str = br.readLine()) != null){
System.out.println(str);
}
br.close();
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
运行结果:
<!DOCHTML html>
<html>
<head>
<meta charset="utf-8">
<title>"菜鸟教程"</title>
</head>
<body>
<h1>我的第一个demo</h1>
<p>我的第一个段落</p>
</body>
</html>