针对输入流FileInputStream和FileReader详解

输入流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>

猜你喜欢

转载自blog.csdn.net/qq_42750329/article/details/89514832
今日推荐