IO流基本概念
IO流主要分为两类
- 节点流:直接能够进行数据写入或读取的I0流。可以单独执行读写操作,但是功能比较单一,只能进行一些基本
的操作。例如:FileInputStream
FileInputStream fis = new FileInputStream("");
- 包装流:自己本身不能够进行直接的数据读写,需要包装另外的一个I0流,组装起来使用。包装流的作用就是增
强另外一个流的功能。例如:InputStreamReader ,BufferedInputStream
FileInputStream fis = new FileInputStream("");
//对fis 进行包装
InputStreamReader isr = new InputStreamReader(fis);
节点流可以被包装,但是能够被包装的不一定是节点流。还可以是包装流,(包装流包装包装流(套娃!))
FileInputStream fis = new FileInputStream("");
//对fis 进行包装
InputStreamReader isr = new InputStreamReader(fis);
//套娃
BufferedInputStream bis = new BufferedInputStream(isr);
如何区分节点流和包装流
可以单独new出来,而不需要传入InputStream对象的就是节点流,必须传入InputStream对象的为包装流
- FileInputStream 与 BufferedInputStream 二者的区别
FileInputStream 是默认每次从文件中读取一个字节,这样子效率非常的低,于是我们一般使用一个byte类型的数组来当做缓冲区,使得每次读取byte数组长度的字节,这样子效率就会比较高。
而BufferedInputStream 就相当于多我们的缓冲区做了封装,我们不用自己去考虑缓冲区,它自己内部已经处理好
思考:BufferedInputStream 效率这么高,我们还需要FileInputStream 做什么呢?
对于不同的业务场景,使用的类也就不一样,BufferedInputStream 虽然效率很高,但是如果我们的业务需求对于文件中实时修改的文本也能在程序中输出出来,那么使用BufferedInputStream 就不是很合理;
因为对于BufferedInputStream 来说,默认的缓冲区大小是8kb,我们在第一次读取的时候就会读取8kb个字节的数据,如果我们对这些数据进行修改的话,我们在程序中拿到的还是修改前(存在于缓存中)的数据
我们可以实际测试一下:
测试文件demo.txt
AA
我们在使用BufferedInputStream 读取一个字节后睡眠5秒钟然后再读取下一个字节
public static void main(String[] args) throws Exception {
String path = "src/main/java/com/xj/dayio/demo.txt";
FileInputStream fis = new FileInputStream(path);
BufferedInputStream bis = new BufferedInputStream(fis);
int read1 = bis.read();
System.out.println((char)read1);
Thread.sleep(5000);
int read2 = bis.read();
System.out.println((char)read2);
}
当程序输出第一个“A”并且睡眠时,我们迅速修改demo.txt文件中的“AA”为“BB”,然后保存,我们可以看到该代码的第二次输出仍然是“A”
而我们使用FileInputStream 的话:依旧是上面的代码,只不过是将bis改为fis
public static void main(String[] args) throws Exception {
String path = "src/main/java/com/xj/dayio/demo.txt";
FileInputStream fis = new FileInputStream(path);
int read1 = fis.read();
System.out.println((char)read1);
Thread.sleep(5000);
int read2 = fis.read();
System.out.println((char)read2);
}
当程序输出第一个“A”并且睡眠时,我们迅速修改demo.txt文件中的“AA”为“BB”,然后保存,我们可以看到该代码的第二次输出改为了“B”。
虽然绝大多数情况下BufferedInputStream 是比FileInputStream 效率高,但是不能说FileInputStream 是没有用的,只不过是业务场景不同罢了。