【Java】字节输入流读取数据的细节

一、创建字节输入流对象

细节1:如果文件不存在,就直接报错

注意模块下是没有 b.txt 的,如果运行下面代码,就会直接报错

image-20240502194641494
//1.创建对象
FileInputStream fis = new FileInputStream("myio\\b.txt");
//2.读取数据
int b1 = fis.read();
System.out.println((char)b1);
//3.释放资源
fis.close();

Java为什么这么设计呢?

输出流有一个特点:不存在会创建,但是需要保证父级路径是存在的。

但是输入流为什么不会创建,而是报错呢?

在输出流的时候,我们要做的是把数据写到文件中,在这个过程中,最重要的是数据,因此它在本地创建一个文件,将数据写到文件中是完全没有任何问题的。

但是输入流,在读取的时候,数据在文件中。如果Java创建输入流对象的时候,文件不存在也创建一个新的,那么此时创建出来的就是一个空文件夹,这是没有意义的。

结论:因为创建出来的文件是没有数据的,没有任何意义。因此Java就没有设计这种无意义的逻辑,文件不存在直接报错。

通过这个问题我们也知道了,程序中最重要的其实是数据。


二、读取数据

细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字

细节2:读到文件末尾了,read方法返回-1

在读取数据的时候,相当于有一个指针,在一开始的时候默认指向第一个数据,当我们调用一次 read() 后它就会读取 a 并移动一次指针,不断往后,读一次移动一次。

image-20240502195521082

等读到末尾后,再次调用 read() 就读不到数据了,既然读不到,那就表示到了文件末尾了,方法会返回 -1

image-20240502195548059

因此在以后就可以根据 read() 的返回值判断我们是否读取到了末尾。

但如果文件中有空格,空格也是数据,那么读取到程序中的就是空格在ASCII中所对应的数字。

如果文件中是 -1,那么在读取的时候会将它分开,先读 -,再读 1


三、释放资源

每次使用完流后必须要释放资源。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值