Java通過稱為流的抽象來執(zhí)行I/O操作。 Java定義了兩種基本類型的流,稱為字節(jié)流和字符流。字節(jié)流類提供了一種方便的方式來處理字節(jié)的輸入和輸出,而字符流分別提供了一種方便的方式來處理字符的輸入和輸出。本文詳細闡述了Java中流處理的這兩個概念。對Java感興趣的同學,可以參加Java培訓來獲得知識和技能,以便快速上崗。
流概述
從Java的角度來看,“流”本質(zhì)上是指一種抽象,用于產(chǎn)生和消費順序信息流。信息流可以是在鏈接到Java I/O子系統(tǒng)的任何物理設備上執(zhí)行的輸入或輸出操作的結(jié)果。實際鏈接的設備可能會有所不同,例如本地存儲設備或網(wǎng)絡。但是,基本原理保持不變。通常Java流支持多種設備,如鍵盤、網(wǎng)絡套接字、磁盤文件等。因此,它為實際鏈接到的不同類型的設備提供了一種方便的方式來處理I/O操作。steam類捆綁在java.io包中。
字節(jié)流和字符流
Java中有兩種類型的流:字節(jié)和字符。當I/O流管理8位字節(jié)的原始二進制數(shù)據(jù)時,稱為字節(jié)流。并且,當I/O流管理16位Unicode字符時,稱為字符流。 Unicode 集基本上是一種字符集,其中每個字符對應于給定字符集中的特定數(shù)值。通常,每種編程語言都采用特定的字符集來表示和管理其對字符的使用。除了Unicode,另一個常用的字符集是ASCII,由國際標準組織 (ISO) 定義。在Java(1.0 版)開始時,它沒有字符流;因此,所有I/O操作都是面向字節(jié)的。字符流是后來引入的(1.1 版)。請注意,字符流和字節(jié)流的概念不應與低級I/O操作混在一起;畢竟,它們總是位和字節(jié)。但是,字符流和字節(jié)流本質(zhì)上提供了一種方便高效的方式來處理Java中的數(shù)據(jù)流。
有什么不同?
如前所述,差異只是為了方便。有些流本質(zhì)上是面向字節(jié)的,有些是面向字符的。因此,使用I/O流包中定義的適當類和方法來處理它們總是很方便。例如,F(xiàn)ileOutputStream用于讀取原始字節(jié)流,例如圖像數(shù)據(jù)。同樣,F(xiàn)ileOutputStream 對象可用于寫入原始字節(jié)流。在類似的情況下,可以分別使用基于面向字符的數(shù)據(jù)流FileReader和FileWriter來讀寫文件。這些類提供了特定的方法來操作適當?shù)牧鲾?shù)據(jù)。想掌握 Java 技術(shù)的同學不妨報個Java培訓班,可以節(jié)省學習時間,提高學習效率,在短時間內(nèi)學有所成,還能找到一份不錯的工作。
字節(jié)流類
在字節(jié)流類層次結(jié)構(gòu)的頂部,有兩個抽象類:InputStream 用于面向字節(jié)的輸入,OutputStream 用于面向字節(jié)的輸出操作。分層布局如下:
InputStream:面向字節(jié)的輸入流的頂級抽象類。
ByteArrayInputStream:此類的一個實例包含一個用于讀取字節(jié)流的內(nèi)部緩沖區(qū)。
FilterInputStream:此類的一個實例包含一些其他輸入流,作為進一步操作的基本數(shù)據(jù)源。
BufferedInputStream:這使FilterInputStream實例能夠使用緩沖區(qū)來存儲輸入數(shù)據(jù)。
DataInputStream:此類的一個實例能夠以與機器無關(guān)的方式從底層輸入流中讀取原始 Java 類型。
LineNumberInputStream:此類的一個實例有助于跟蹤輸入流的當前行號。
PushbackInputStream:這提供了在讀取數(shù)據(jù)字節(jié)后推回或“未讀”數(shù)據(jù)字節(jié)的能力。
FileInputStream:此類的一個實例用于從文件系統(tǒng)中的文件中獲取輸入字節(jié)。
ObjectInputStream:該類的一個實例用于在對象被 ObjectOutputSteam 序列化后對其進行反序列化。
PipedInputStream:這個類的一個實例為輸入字節(jié)提供了一個管道或緩沖區(qū),它以 FIFO 方式工作。
SequenceInputStream:此類的一個實例表示兩個或多個輸入流的邏輯串聯(lián),這些輸入流一個接一個地依次讀取。
OutputStream:面向字節(jié)的輸入流的頂級抽象類。在java培訓中,有更加系統(tǒng)全面的課程,明確清晰的學習路線,學習起來既輕松,又高效。
ByteArrayOutputStream:此類的一個實例包含一個用于寫入字節(jié)流的內(nèi)部緩沖區(qū)。
FilterOutputStream:此類的一個實例包含一些其他輸出流,作為進一步操作的基本數(shù)據(jù)源。
BufferedOutputStream:這使 FilterOutputStream實例能夠使用緩沖區(qū)來輸出數(shù)據(jù)。
DataOutputStream:此類的一個實例能夠以與機器無關(guān)的方式將原始 Java 類型寫入底層輸出流。
PrintStream:這使 OutputStream 對象能夠方便地打印各種數(shù)據(jù)值的表示形式。
FileOutputStream:此類的一個實例用于輸出流,用于將數(shù)據(jù)寫入文件或文件描述符。
ObjectOutputStream:這個類的一個實例用于序列化一個可以用ObjectInputStream反序列化的對象。
PipedOutputStream:這個類的一個實例為輸出字節(jié)提供了一個管道或緩沖區(qū),它以先進先出的方式工作。
字符流類
在字符流類層次結(jié)構(gòu)的頂部,有兩個抽象類:面向字符輸入的Reader和面向字符輸出操作的Writer。分層布局如下:
Reader:用于讀取字符流的頂級抽象類。
BufferedReader:在從字符輸入流讀取文本時提供中間緩沖區(qū)以提高效率。
LineNumberReader:使用緩沖的字符輸入流來跟蹤行號。
CharArrayReader:實現(xiàn)可用作閱讀器的自動遞增字符緩沖區(qū)。
FilterReader:該類的一個實例用于讀取字符文件。
PushbackReader:這使字符能夠在讀取后被推回流中。想學習更多 Java 知識和技能,建議參加java培訓,課程實時更新,緊跟市場和企業(yè),讓你學到最新的java技能,提高市場競爭力。
InputStreamReader:這個類的一個實例提供了從字節(jié)流到字符流的橋梁。使用指定的字符集將字節(jié)解碼為字符。
FileReader:該類的一個實例用于讀取字符文件。
PipedReader:對字符輸入流使用管道。
StringReader:來自源字符串的字符輸出流讀取器。
Writer:寫入字符流的頂級抽象類。
BufferedWriter:在將文本寫入字符輸出流時提供中間緩沖區(qū)以提高效率。
CharArrayWriter:實現(xiàn)可用作寫入器的自動遞增字符緩沖區(qū)。
FilterWriter:用于編寫過濾字符流的抽象類。
OutputStreamWriter:這個類的一個實例提供了字符流和字節(jié)流之間的橋梁。使用指定的字符集將字符編碼為字節(jié)。
FileWriter:該類的一個實例用于寫入字符文件。
PipedWriter:使用管道進行字符輸出流。
PrintWriter:將對象的格式化表示打印到測試輸出流。
StringWriter:字符輸出流被收集在字符串緩沖區(qū)中,可用于構(gòu)造字符串。
預定義流
Java 提供了三個預定義的流對象:in、out和err,它們在java.lang包的System類中定義。out對象是指標準輸出流或控制臺。in對象指的是標準輸入,也就是鍵盤。而且,err對象指的是標準錯誤,它也只是控制臺。應該很明顯,它們可能被重定向到任何其他兼容的I/O設備,因為System.in只不過是InputStream的一個對象,而System.out和System.err是PrintStream類的對象。因此,它們基本上工作在面向字節(jié)的流上,盡管我們可以使用它們在控制臺中讀取和寫入字符。
結(jié)論
Java 流充當文件處理包裝器,根據(jù)相應的I/O結(jié)構(gòu)進行操作。在許多情況下,面向字符的流類和面向字節(jié)的流類的功能非常相似。但是,這并不意味著它們沒有區(qū)別。java.io包中定義的流類相當簡單且不復雜,但它們確實起到了作用。另一方面,Java 8引入的新流更加復雜并且有許多有趣的用途。參加以實戰(zhàn)項目為主要教學方法的Java培訓,可以有效地縮短同企業(yè)具體用人需求之間的差距,快速提升自己。