文章目录
一、创建字节输入流对象
细节1:如果文件不存在,就直接报错
注意模块下是没有 b.txt
的,如果运行下面代码,就会直接报错

//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
并移动一次指针,不断往后,读一次移动一次。

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

因此在以后就可以根据 read()
的返回值判断我们是否读取到了末尾。
但如果文件中有空格,空格也是数据,那么读取到程序中的就是空格在ASCII中所对应的数字。
如果文件中是 -1
,那么在读取的时候会将它分开,先读 -
,再读 1
。
三、释放资源
每次使用完流后必须要释放资源。