摘要:基本輸入流輸入流類中包含兩類功能輸入流的兩大功能讀取流中字節數據的功能是通過方法來完成。基本輸出流與類相對應的類表示基本的輸出流,用來把數據從程序輸出到其他地方。
一堆廢話(趕快跳過)
在我們的日常開發中 I/O 涉及到我們開發的方方面面,雖然早在 JDK1.5 就新增了 NIO的概念,但是 java.io 的使用以及技巧在我們的日常開發中還是占據很高的比重。
概念(不看也行)最基本的I/O 流是 java.io 包中的抽象類 java.io.InputStream 和 java.io.OutputStream。s有預留的設計比較早,因此并沒有采用現在流行的面向接口的編程思路,而是采用了抽象類。新增的IO相關的API則大量使用了接口。如果留的實現只是對使用者暴漏字節這個層次的細節,則可以直接集成InputStream 或 OutputStream 類,并且提供自己二外的能力。
在接下來的幾個章節中,會逐章記錄
以下各種流類的詳細使用方法
BufferedInputStream, BufferedOutputStream 緩沖復用流
ByteArrayInputStream, ByteArrayOutputStream byte數組緩沖流
DataInputStream, DataOutputStream java原生數據流
ObjectInputStream, ObjectOutputStream 對象序列化流
PushbackInputStream, PushbackOutputStream 推回流
PipedInputStream, PipedOutputStream 管道流
SequenceInputStream, SequenceOutputStream 序列流
和字符流類和字符流的的裝飾類
Reader, Writer
InputStreamReader, InputStreamWriter
StringReader, StringWriter
BufferedReader, BufferedWriter
CharArrayReader, CharArrayWriter
同時也會記錄一些 java8 融入 Google guava 類庫對 流類的支持。
基本輸入流輸入流 InputStream類中包含兩類功能
輸入流的兩大功能讀取流中字節數據的功能是通過 read 方法來完成。該方法有以下3種重載形式
public abstract int read() throws IOException
public int read(byte b[]) throws IOException
public int read(byte b[], int off, int len) throws IOException
比較常見的操作流的方式就是 創建一個字節數組作為緩沖區,然后循環讀取,直到read方法返回-1或拋出 java.io.IOException 異常。read方法的返回值是每次調用中成功讀取的字節數。 需要要注意的是在讀取的過程中,對read方法調用是阻塞的。當流中沒有數據可用時,對read方法的調用需要等待。這種阻塞式的特性可能會成為應用中的性能瓶頸。
如果不使用字節數組,那么read方法每次只能讀取到一個字節,再有緩沖區的情況下雖然InputStream類每次也只是讀取一個字節,但是 InputStream類的子類一般會接受一個緩沖區最為參數的read方法提供更高效的實現。
抽象正像他的名字一樣,字節流是流動的,像流水一樣。劉中的字節一旦流過去,就無法重新使用。
控制流的功能。
close 關閉功能
通過 close 方法,我們可以關閉一個 流,就像擰上水管龍頭一樣。java7及以后,更推薦使用 try-with-resource 語句來使用流。可以避免顯示的調用close方法。
javatry ( FileInputStream fInput = new FileInputStream(new File("path/to/exists_file")); FileOutputStream fOutput = new FileOutputStream(new File("path/to/new_file")); ) { // ....fInput -> read -> fOutput } catch (IOException e) { ..... } catch (FileNotFoundException e) { ..... }
skip 跳過若干個字節。相當于保留當前的位置往后移動若干個字節,這個功能可以通過skip方法來實現并不是所有的InputStream累都支持skip方法。
mark 讀取位置標記
reset 讀取位置重置
標記和重置是配合使用的,可以實現可以實現流中的內容重復讀取,而不會像一般的讀取那樣操作,數據流過去之后就無法在次讀取。但是并不是所有的流都支持標記功能,因此在使用mark方法來標記當前位置之前,需要通過markSupporetd方法來判斷當前流的實現是否支持標記功能。
available 獲取當沒有阻塞情況下,當前流中還有多少字節可供讀取。如果我們每次讀取調用available方法獲取到的字節書,不如在讀取一個大文件的同時對文件的內容進行處理,如果每次讀取是都不發生阻塞,就可以比較好的平均數據讀取和處理的時間。
基本輸出流與InputStream類相對應的OutputStream類表示基本的輸出流,用來把數據從程序輸出到其他地方。基本OutputStream類的對象也是在自己這個層次上操作。其中最主要的是寫入數據的write方法。
write 寫入方法。
public abstract void write(int b) throws IOException
public void write(byte b[]) throws IOException
public void write(byte b[], int off, int len) throws IOException
write 方法也有3種類似的重載形式,可以每次寫入一個字節,也可以寫入一個字節數組中全部或部分內容。
控制方法
close 方法
關閉當前輸出流
flush 方法
強制要求OutputStream類對象對暫時保持內部緩沖區中的內容立即進行實際的寫入操作。因為有些OutputStream類的子類會在內部維護一個緩沖區,通過write方法寫入的數據會被首先放在這個緩沖區中,然后再摸個適合的實際執行已經緩沖的內容的寫入操作。在一般的場景中OutputStream對象的使用者一般不需要直接調用flush方法保證內部緩沖區數據成功寫入。這是因為當OutputStream類對象內部的緩沖區滿了以后,會自動執行寫入操作。OutputStram類的對象被關閉時,flush方法一般也會被自動調用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64233.html
摘要:通過多個裝飾類實現責任鏈模式,它將對一個輸入流的不同處理分散到不同的中去。 1、基本概念 1.1、InputStream 最基本的字節輸入流,抽象類,定義了讀取原始字節的所有基本方法1.1.1、public abstract int read() throws IOException 讀取一個字節的方法,最基礎的方法1.1.2、public int read(byte b[], in...
摘要:是方法返回值的數據類型。方法名和參數表共同構成方法簽名。構造方法和它所在類的名字相同,但構造方法沒有返回值。輸入流表示從一個源讀取數據,輸出流表示向一個目標寫數據。下圖是一個描述輸入流和輸出流的類層次圖。有多種構造方法可用來創建對象。 我們經常使用到 System.out.println(),那么它是什么呢? 一、系統方法 我們經常使用到 System.out.println(),那么...
摘要:一面試題及剖析今日面試題今天壹哥帶各位復習一塊可能會令初學者比較頭疼的內容,起碼當時讓我很有些頭疼的內容,那就是流。在這里壹哥會從兩部分展開介紹流,即與流。除此之外盡量使用字節流。關閉此輸入流并釋放與流相關聯的任何系統資源。 一. 面試題及剖析 1. 今日面試題 今天 壹哥 帶各位復習一塊可...
摘要:在包下主要包括輸入輸出兩種流,每種輸入輸出流又可分為字節流和字符流兩大類。輸入輸出是從程序運行所在的內存的角度而言的。的輸入流主要由和作為基類,而輸出流主要由和作為基類。 本章主要參考和摘自瘋狂java講義上面的(java編程思想的后面看過后有新的內容再補充進去吧)。 輸入輸出是所有程序都必需的部分————使用輸入機制允許程序讀取外部數據(包括磁盤、光盤等存儲設備上的數據和用戶輸入的...
摘要:分類一按操作方式類結構字節流和字符流字節流以字節為單位,每次次讀入或讀出是位數據。該對象并不是流體系中的一員,其封裝了字節流,同時還封裝了一個緩沖區字符數組,通過內部的指針來操作字符數組中的數據。 分類一:按操作方式(類結構) 字節流和字符流: 字節流:以字節為單位,每次次讀入或讀出是8位數據。可以讀任何類型數據。 字符流:以字符為單位,每次次讀入或讀出是16位數據。其只能讀取字符類...
閱讀 2225·2021-09-07 09:58
閱讀 3404·2019-08-30 14:07
閱讀 1311·2019-08-29 12:32
閱讀 680·2019-08-29 11:06
閱讀 3703·2019-08-26 18:18
閱讀 3744·2019-08-26 17:35
閱讀 1392·2019-08-26 11:35
閱讀 619·2019-08-26 11:35