FileInputStream是InputStream的子类,即从文件流中读取数据,它的父类InputStream是java中自带的输入流,位于java.io包下,是一个抽象类,实现Closeable接口,使用完要关闭。
而FileInputStream继承自InputStream,实现了read()方法,进行字节读取:
package com.yx.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class Demo01 {
public static void main(String[] args) {
//定义
InputStream in = null;
try {
//创建(实例化)"字节输入流"对象
in = new FileInputStream("D:\\test\\1.txt");
// int data1 = in.read(); //读取第一个字节
// int data2 = in.read();//读取第二个字节
// int data3 = in.read();//读取第三个字节
//
// System.out.println((char)data1);
// System.out.println((char)data2);
// System.out.println((char)data3);
//文件读取错误示范
// while(true) {
// int data = in.read();
// if(data == -1) {
// break;
// }
// System.out.println((char)data);
// }
//
// //关闭
// in.close();
//保存每次读取到的字节值
int data = -1;
//正常读取:0-255
//读取末尾:-1
while((data = in.read()) != -1) {
System.out.print((char)data);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
in = null;
}
}
}
}
一个字节一个字节读取,效率很慢,InputStream中read()方法重载后,自建缓冲区,自定义一个byte类型的数组,读取若干个字节,存放至数组,返回读取的字节数,以便于提高效率:
package com.yx.demo;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
public class Demo03 {
public static void main(String[] args) {
try (InputStream in = new FileInputStream("D:\\test\\美女.jpg")) {
// int data = -1;
// while((data = in.read()) != -1) {
// System.out.println(data);
// }
//批量读取(缓冲)
byte[] buff = new byte[128];
int len = -1;
while((len = in.read(buff))!= -1) {
System.out.printf("本次读取到%d个字节:%s\n",len,Arrays.toString(buff));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedInputStream是缓冲输入流,继承自FilterInputStream,自带缓冲区,缓冲区大小为8192bit,BufferedInputStream必须要配合传入一个InputStream类型的对象,所采用的是装饰器模式。
源码如下:(本代码只展示一种重载方式,也可以自定义缓冲区大小)
public BufferedInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE); //8192
}
BufferedInputStream也可以一个字节一个字节读取,每调用一次read()方法,都会去缓冲区(内存中)读取一个字节,但效率不高。
在读取字节时,调用read()方法FileInputStream在磁盘中读取,而 BufferedInputStream是从内存的缓冲区读取,使用 BufferedInputStream批量读取实例代码如下:
package com.yx.demo;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) {
//带有缓冲区的字节输入流
//缓冲区默认大小8192
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\test\\美女.jpg"))) {
//从内存的buff缓冲区中读取1个字节
//bis.read();
int data = -1;
while((data = bis.read())!= -1) {
System.out.println(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}