1.1 Java流是什么?输入/输出流又是什么?
在 Java 中所有數(shù)據(jù)都是使用流讀寫的。流是一組有序的數(shù)據(jù)序列,將數(shù)據(jù)從一個(gè)地方帶到另一個(gè)地方。根據(jù)數(shù)據(jù)流向的不同,可以分為輸入(Input)流和輸出(Output)流兩種。
在學(xué)習(xí)輸入和輸出流之前,我們要明白為什么應(yīng)用程序需要輸入和輸出流。例如,我們平時(shí)用的 Office 軟件,對于 Word、Excel 和 PPT 文件,我們需要打開文件并讀取這些文本,和編輯輸入一些文本,這都需要利用輸入和輸出的功能。在現(xiàn)實(shí)生活中,輸入和輸出的例子比比皆是。
在前面章節(jié)中,我們經(jīng)常使用“System.out.println”方法,它就是一個(gè)輸出方法。后面我們會講述更多的方法,并通過大量的實(shí)例來展示它們的用法。
下面詳細(xì)介紹什么是輸入流和輸出流,以及 Java 中流的類型及每種類型的相關(guān)類。
什么是輸入/輸出流
Java 程序通過流來完成輸入/輸出,所有的輸入/輸出以流的形式處理。因此要了解 I/O 系統(tǒng),首先要理解輸入/輸出流的概念。
輸入就是將數(shù)據(jù)從各種輸入設(shè)備(包括文件、鍵盤等)中讀取到內(nèi)存中,輸出則正好相反,是將數(shù)據(jù)寫入到各種輸出設(shè)備(比如文件、顯示器、磁盤等)。例如鍵盤就是一個(gè)標(biāo)準(zhǔn)的輸入設(shè)備,而顯示器就是一個(gè)標(biāo)準(zhǔn)的輸出設(shè)備,但是文件既可以作為輸入設(shè)備,又可以作為輸出設(shè)備。
數(shù)據(jù)流是 Java 進(jìn)行 I/O 操作的對象,它按照不同的標(biāo)準(zhǔn)可以分為不同的類別。
- 按照流的方向主要分為輸入流和輸出流兩大類。
- 數(shù)據(jù)流按照數(shù)據(jù)單位的不同分為字節(jié)流和字符流。
- 按照功能可以劃分為節(jié)點(diǎn)流和處理流。
數(shù)據(jù)流的處理只能按照數(shù)據(jù)序列的順序來進(jìn)行,即前一個(gè)數(shù)據(jù)處理完之后才能處理后一個(gè)數(shù)據(jù)。數(shù)據(jù)流以輸入流的形式被程序獲取,再以輸出流的形式將數(shù)據(jù)輸出到其它設(shè)備。圖 1 為輸入流模式,圖 2 為輸出流模式。
IO流總覽
IO流分類
按照“流”的數(shù)據(jù)流向,可以將其化分為:輸入流和輸出流。
按照“流”中處理數(shù)據(jù)的單位,可以將其區(qū)分為:字節(jié)流和字符流。
在java中,字節(jié)是占1個(gè)Byte,即8位;而字符是占2個(gè)Byte,即16位。而且,需要注意的是,java的字節(jié)是有符號類型,而字符是無符號類型!
字節(jié)流的抽象基類:InputStream,OutputStream
字符流的抽象基類:Reader,Writer
由這四個(gè)類派生出來的子類名稱都是以其父類名作為子類名的后綴,如InputStream的子類FileInputStream,Reader的子類FileReader。
輸入流
Java 流相關(guān)的類都封裝在 java.io 包中,而且每個(gè)數(shù)據(jù)流都是一個(gè)對象。所有輸入流類都是 InputStream 抽象類(字節(jié)輸入流)和 Reader 抽象類(字符輸入流)的子類。其中 InputStream 類是字節(jié)輸入流的抽象類,是所有字節(jié)輸入流的父類,其層次結(jié)構(gòu)如圖 3 所示。
InputStream 類中所有方法遇到錯誤時(shí)都會引發(fā) IOException 異常。如下是該類中包含的常用方法。
InputStream 類常用方法
- int read():從輸入流讀入一個(gè) 8 字節(jié)的數(shù)據(jù),將它轉(zhuǎn)換成一個(gè) 0~ 255 的整數(shù),返回一個(gè)整數(shù),如果遇到輸入流的結(jié)尾返回 -1
- int read(byte[] b):從輸入流讀取若干字節(jié)的數(shù)據(jù)保存到參數(shù) b指定的字節(jié)數(shù)組中,返回的字節(jié)數(shù)表示讀取的字節(jié)數(shù),如果遇到輸入流的結(jié)尾返回 -1
- int read(byte[] b,int off,int len):從輸入流讀取若干字節(jié)的數(shù)據(jù)保存到參數(shù) b 指定的字節(jié)數(shù)組中,其中off 是指在數(shù)組中開始保存數(shù)據(jù)位置的起始下標(biāo),len 是指讀取字節(jié)的位數(shù)。返回的是實(shí)際讀取的字節(jié)數(shù),如果遇到輸入流的結(jié)尾則返回 -1
- void close():關(guān)閉數(shù)據(jù)流,當(dāng)完成對數(shù)據(jù)流的操作之后需要關(guān)閉數(shù)據(jù)流
- int available():返回可以從數(shù)據(jù)源讀取的數(shù)據(jù)流的位數(shù)。
- skip(long n):從輸入流跳過參數(shù) n 指定的字節(jié)數(shù)目
- boolean markSupported():判斷輸入流是否可以重復(fù)讀取,如果可以就返回 true
- void mark(int readLimit):如果輸入流可以被重復(fù)讀取,從流的當(dāng)前位置開始設(shè)置標(biāo)記,readLimit指定可以設(shè)置標(biāo)記的字節(jié)數(shù)
- void reset():使輸入流重新定位到剛才被標(biāo)記的位置,這樣可以重新讀取標(biāo)記過的數(shù)據(jù)
上述最后 3 個(gè)方法一般會結(jié)合在一起使用:
首先使用 markSupported() 判斷,如果可以重復(fù)讀取,
則使用 mark(int readLimit) 方法進(jìn)行標(biāo)記,
標(biāo)記完成之后可以使用 read() 方法讀取標(biāo)記范圍內(nèi)的字節(jié)數(shù),
最后使用 reset() 方法使輸入流重新定位到標(biāo)記的位置,繼而完成重復(fù)讀取操作。
Java 中的字符是 Unicode 編碼,即雙字節(jié)的,而 InputerStream 是用來處理單字節(jié)的,在處理字符文本時(shí)不是很方便。這時(shí)可以使用 Java 的文本輸入流 Reader 類,該類是字符輸入流的抽象類,即所有字符輸入流的實(shí)現(xiàn)都是它的子類,該類的方法與 InputerSteam 類的方法類似,這里不再介紹。
輸出流
在 Java 中所有輸出流類都是 OutputStream 抽象類(字節(jié)輸出流)和 Writer 抽象類(字符輸出流)的子類。其中 OutputStream 類是字節(jié)輸出流的抽象類,是所有字節(jié)輸出流的父類,其層次結(jié)構(gòu)如圖 4 所示。
OutputStream 類是所有字節(jié)輸出流的超類,用于以二進(jìn)制的形式將數(shù)據(jù)寫入目標(biāo)設(shè)備,該類是抽象類,不能被實(shí)例化。OutputStream 類提供了一系列跟數(shù)據(jù)輸出有關(guān)的方法,如下所示。
- int write(b):將指定字節(jié)的數(shù)據(jù)寫入到輸出流
- int write (byte[] b):將指定字節(jié)數(shù)組的內(nèi)容寫入輸出流
- int write (byte[] b,int off,int len):將指定字節(jié)數(shù)組從 off 位置開始的 len
字節(jié)的內(nèi)容寫入輸出流 - close():關(guān)閉數(shù)據(jù)流,當(dāng)完成對數(shù)據(jù)流的操作之后需要關(guān)閉數(shù)據(jù)流
- flush():刷新輸出流,強(qiáng)行將緩沖區(qū)的內(nèi)容寫入輸出流
總結(jié)
以上是生活随笔為你收集整理的1.1 Java流是什么?输入/输出流又是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thread 方法
- 下一篇: 1.2 Java系统流