日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

FileInputStream與BufferedInputStream的區別

作者:CHAN YEOL? 更新時間: 2022-07-13 編程語言

Java標準庫的java.io.InputStream定義了所有輸入流的超類:

FileInputStream實現了文件流輸入;

BufferedInputStream使用緩沖區提高文件的讀取效率;

ByteArrayInputStream在內存中模擬一個字節流輸入;

一. FileInputStream(文件輸入流)

FileInputStream是InputStream的子類,是從文件流中讀取數據,每次讀取都是從硬盤中讀取,讀取速度較慢;

InputStream中通過 read()方法讀取輸入流的下一字節,并返回字節表示的 int 值(0 ~ 255),如果讀到-1就不能繼續讀取;

InputStream緩沖讀?。合榷x一個byte[]數組作為緩沖區,read()方法會盡可能多的讀取字節到緩沖區,但不會超過緩沖區的大小。

利用緩沖區一次讀取InputStream的所有字節(兩種方法):

(1)? 逐個字節讀取;(2)批量讀取。

代碼實現如下:

try (InputStream in = new FileInputStream("D:\\countNumber.text")) {
             // 方式1:逐個字節讀取
//		int data = -1;
//		while((data = in.read()) != -1) {
//			System.out.println((char)data);
//		}
			// 方式2:批量讀取
			byte[] buff = new byte[1000]; // 定義1000個字節大小的緩沖區
			int size = -1;
			while((size = in.read(buff)) != -1) {
				System.out.println();
			}
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
		

二 . BufferedInputStream(緩沖輸入流)

BufferedInputStream是緩沖輸入流(帶有緩沖區的字節輸入流),繼承于FilterInputStream(是InputStream的子類),作用是為另一個輸入流添加一些功能:提供緩沖功能以及支持“mark() 標記”,“reset()重置方法";

BufferedInputStream本質是通過一個內部緩沖區數組實現的,它有一個默認大小為8192的緩沖區(讀取速度較快)。例如,在新建某輸入流對應的BufferedInputStream后,當我們通過read()讀取輸入流的數據時,BufferedInputStream會將該輸入流的數據分批的填充到緩沖區中。每當緩沖區的數據被讀完之后,輸入流會再次填充數據緩沖區;如此反復,直到我們讀完輸入流數據位置。

public class BufferedInputStream extends FilterInputStream {

    private static int DEFAULT_BUFFER_SIZE = 8192;
    ...}
			try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\countNumber.text"))) {
			// 方式1:逐個字節讀取
			// int data = -1;
			//while((data = bis.read()) != -1) {
		//		System.out.println(data);
		//	}
			// 方式2:批量讀取
			byte[] buffData = new byte[128]; // 用來存儲每次讀取到的字節數組

			int len = -1; // 每次讀取到的字節數組的長度
			while((len = bis.read(buffData)) != -1) {
				System.out.println(Arrays.toString(buffData));
			}
		} catch (IOException e) {
			e.printStackTrace();
		} 

?注:如果打開了一個文件進行讀寫,完成后要及時關閉,以便讓os釋放資源 (try語句:快捷鍵:shift+alt+z,編譯器會自動寫入finally并調用close()),實際上,編譯器并不會特別的為InputStream加上自動關閉,而是因為其實現了AutoCloseable接口,由于實現了此接口,才會自動寫入finally并調用close();

原文鏈接:https://blog.csdn.net/weixin_45939128/article/details/124851050

欄目分類
最近更新