字节输入流(InputStream)
java.io.InputStream
抽象类是表示字节输入流的所有类的超类,注意该类是个抽象类
子类共性的成员方法
public void close()
方法的作用:关闭输入流并释放与该流有关的所有系统资源public int read()
方法的作用:一次读一次字节,读完指针后移一位,读取到末尾返回-1public int read(byte[ ] b)
方法的作用:从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
介绍一次读取多个字符的方法
public int read(byte[ ] b)
方法的作用:从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
1、参数的作用是什么?
起到了缓冲的作用,存储每次读取到多个字节,数组长度一般定义为1024或者1024的整数倍
2、返回值的含义是什么?
返回的是每次读取的有效字节个数
举例说明该方法
public static void main(String[] args){
FileInputStream fis = new FileInputStream("d:\\a.txt");//已知该文件中的内容为ABCDE
byte[] bytes = new byte[2];
int len = fis.read(bytes);
System.out.println(len);//打印输出得到的是2
System.out.println(new String(bytes));//打印输出得到的是AB
int len = fis.read(bytes);
System.out.println(len);//打印输出得到的是2
System.out.println(new String(bytes));//打印输出得到的是CD
int len = fis.read(bytes);
System.out.println(len);//打印输出得到的是1
System.out.println(new String(bytes));//打印输出得到的是ED
int len = fis.read(bytes);
System.out.println(len);//打印输出得到的是-1
System.out.println(new String(bytes));//打印输出得到的是ED
}
解释如下:
fis.read每次读取一个字节然后存入字节数组中,因为字节数组的长度是2所以依次读取两个字节才能把字节数组放满,每次放满后再次读取的话会覆盖上一次的字节数组,当我们依次读取到了第五个的时候,得到了E然后装入字节数组,覆盖掉原来的C,但是再次读取数组的时候读取到了结束标记,就不继续读取了,所以字节数组中现在剩下的是ED,因为D没有新的字节替换它,所以他的有效读取位数就是1,打印输出len得到的就是1。如果一个有效读取位数都没有的话,打印输出len得到的是-1.
由于InputStream类是抽象类,所以我们通过他的子类FileInStream类来学习它
文件字节输入流,该类的作用是把硬盘文件中的数据,读取到内存中使用
FileInStream类的构造方法
FileInStream(String name)
FileInStream(File file)
参数:读取文件的数据源
String name:文件的路径
File file:文件
构造方法的作用:
1、会创建一个FileInputStream对象
2、会把FileInputStream对象指向构造方法中要读取的文件
字节输入流将硬盘中的数据从内存中读取的过程
java程序---->JVM---->OS(操作系统)----->OS调用读取数据的方法----->读取数据
字节输入流的使用步骤:
1、创建FileInputStream对象,构造方法中绑定要读取的数据源
2、使用FileInputStream对象中的方法read,读取文件
3、释放资源
举例说明
已知a.txt中的内容为abc
public static void main(String[] args) throws IOException {
//1、创建FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("d:\\a.txt");
//2、使用FileInputStream对象中的方法read,读取文件
int len = fis.read();
System.out.println(len);//a.txt中的第一个字母是a,所以打印输出得到97
int len = fis.read();
System.out.println(len);//a.txt中的第一个字母是b,所以打印输出得到98
int len = fis.read();
System.out.println(len);//a.txt中的第一个字母是c,所以打印输出得到99
int len = fis.read();
System.out.println(len);//打印输出的为-1,表示读取完毕
//3、释放资源
fis.close();
}
因为读取数据的时候过于重复我们还可以使用循环的方式优化代码
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("d:\\a.txt");
int len = 0;
while ((len = fis.read()) != -1){// 因为不知道循环几次所以使用while 循环
System.out.println(len);// 得到的结果也是97 98 99
}
fis.close();
}
public int read()方法的读取原理
一次读一次字节,读完指针后移一位,读取到末尾返回-1