FileInputStream与BufferedInputStream的区别

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();
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值