C語言中文網 目錄

Java流的概念:什么是輸入/輸出流?

< 上一頁Java輸入/輸出流 Java系統流下一頁 >

Java 中所有數據都是使用流讀寫的。是一組有序的數據序列,將數據從一個地方帶到另一個地方。根據數據流向的不同,可以分為輸入(Input)流和輸出(Output)流兩種。

下面詳細介紹什么是輸入流和輸出流,以及 Java 中流的類型及每種類型的相關類。

什么是輸入/輸出流

Java 程序通過流來完成輸入/輸出,所有的輸入/輸出以流的形式處理。因此要了解 I/O 系統,首先要理解輸入/輸出流的概念。

輸入就是將數據從各種輸入設備(包括文件、鍵盤等)中讀取到內存中,輸出則正好相反,是將數據寫入到各種輸出設備(比如文件、顯示器、磁盤等)。例如鍵盤就是一個標準的輸入設備,而顯示器就是一個標準的輸出設備,但是文件既可以作為輸入設備,又可以作為輸出設備。

數據流是 Java 進行 I/O 操作的對象,它按照不同的標準可以分為不同的類別。
  • 按照流的方向主要分為輸入流和輸出流兩大類。
  • 數據流按照數據單位的不同分為字節流和字符流。
  • 按照功能可以劃分為節點流和處理流。

數據流的處理只能按照數據序列的順序來進行,即前一個數據處理完之后才能處理后一個數據。數據流以輸入流的形式被程序獲取,再以輸出流的形式將數據輸出到其他設備。圖 1 所示的是輸入流模式,圖 2 所示的是輸出流模式。


圖1 輸入流模式


圖2 輸出流模式

輸入流

Java 流功能相關的類都封裝在 java.io 包中,而且每個數據流都是一個對象。所有輸入流類都是 InputStream 抽象類(字節輸入流)和 Reader 抽象類(字符輸入流)的子類。其中 InputStream 類是字節輸入流的抽象類,是所有字節輸入流的父類,其層次結構如圖 3 所示。


圖3 InputStream類的層次結構圖

InputStream 類中所有方法遇到錯誤時都會引發 IOException 異常。如下是該類中包含的常用方法。
  • int read():從輸入流讀入一個 8 字節的數據,將它轉換成一個 0~255 的整數,返回一個整數,如果遇到輸入流的結尾返回 -1。
  • int read(byte[] b):從輸入流讀取若干字節的數據保存到參數 b 指定的字芳數組中,返回的字芾數表示讀取的字節數,如果遇到輸入流的結尾返回 -1。
  • int read(byte[] b,int off,int len):從輸入流讀取若干字節的數據保存到參數 b 指定的字節數組中,其中 off 是指在數組中開始保存數據位置的起始下標,len 是指讀取字節的位數。返回的是實際讀取的字節數,如果遇到輸入流的結尾則返回 -1。
  • void close():關閉數據流,當完成對數據流的操作之后需要關閉數據流。
  • int available():返回可以從數據源讀取的數據流的位數。
  • skip(long n):從輸入流跳過參數 n 指定的字節數目。
  • boolean markSupported():判斷輸入流是否可以重復讀取,如果可以就返回 true。
  • void mark(int readLimit):如果輸入流可以被重復讀取,從流的當前位置開始設置標記,readLimit 指定可以設置標記的字茍數。
  • void reset():使輸入流重新定位到剛才被標記的位置,這樣可以重新讀取標記過的數據。

上述最后 3 個方法一般會結合在一起使用,首先使用 markSupported() 判斷,如果可以重復讀取,則使用 mark(int readLimit) 方法進行標記,標記完成之后可以使用 read() 方法讀取標記范圍內的字節數,最后使用 reset() 方法使輸入流重新定位到標記的位置,繼而完成重復讀取操作。

Java 中的字符是 Unicode 編碼,即雙字節的,而 InputerStream 是用來處理單字節的,在處理字符文本時不是很方便。這時可以使用 Java 的文本輸入流 Reader 類,該類是字符輸入流的抽象類,即所有字輸入流的實現都是它的子類。

Reader類的具體層次結構如圖 4 所示,該類的方法與 InputerSteam 類的方法類似,這里不再介紹。


圖4 Reader類的層次結構

輸出流

在 Java 中所有輸出流類都是 OutputStream 抽象類(字節輸出流)和 Writer 抽象類(字符輸出流)的子類。其中 OutputStream 類是字節輸出流的抽象類,是所有字節輸出流的父類,其層次結構如圖 5 所示。


圖5 OutputStream類的層次結構圖

OutputStream 類是所有字節輸出流的超類,用于以二進制的形式將數據寫入目標設備,該類是抽象類,不能被實例化。OutputStream 類提供了一系列跟數據輸出有關的方法,如下所示。
  • int write (b):將指定字節的數據寫入到輸出流。
  • int write (byte[] b):將指定字節數組的內容寫入輸出流。
  • int write (byte[] b,int off,int len):將指定字節數組從 off 位置開始的 len 字芳的內容寫入輸出流。
  • close():關閉數據流,當完成對數據流的操作之后需要關閉數據流。
  • flush():刷新輸出流,強行將緩沖區的內容寫入輸出流。

字符輸出流的父類是 Writer,其層次結構如圖 6 所示。


圖6 OutputStream類的層次結構圖
< 上一頁Java輸入/輸出流 Java系統流下一頁 >

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户