文章目錄
- 而OutputStream之所以叫輸出類,是因為它首先需要與寫入的目的地相關聯,然後通過它進行寫入。
- 輸入是:把要讀取的內容輸入到輸入資料流,在從輸入資料流進行讀取,所以是read()。
- 輸出是:把要輸出的東西通過輸出資料流輸出到目的地,所以是write()。
流的概念
流(stream)的概念源於UNIX中管道(pipe)的概念。在UNIX中,管道是一條不間斷的位元組流,用來實現程式或進程間的通訊,或讀寫外圍裝置、外部檔案等。
一個流,必有源端和目的端,它們可以是電腦記憶體的某些地區,也可以是磁碟檔案,甚至可以是Internet上的某個URL。
流的方向是重要的,根據流的方向,流可分為兩類:輸入資料流和輸出資料流。使用者可以從輸入資料流中讀取資訊,但不能寫它。相反,對輸出資料流,只能往輸入資料流寫,而不能讀它。
實際上,流的源端和目的端可簡單地看成是位元組的生產者和消費者,對輸入資料流,可不必關心它的源端是什麼,只要簡單地從流中讀資料,而對輸出資料流,也可不知道它的目的端,只是簡單地往流中寫資料。
形象的比喻——水流 ,記憶體======程式,記憶體和程式之間串連一個管道,水流就在之間形成了,自然也就出現了方向:可以流進,也可以流出.便於理解,這麼定義流:流就是一個管道裡面有流水,這個管道串連了檔案和程式。
我們所說的流,都是針對記憶體說的,比如為什麼列印到螢幕上就是System.out.println();而從螢幕等待使用者輸入的卻是System.in呢?因為對於記憶體來說,把字串列印到螢幕上是從記憶體流向螢幕這個顯示器的,也就是輸出,而從螢幕等待使用者輸入呢?就是等待鍵盤將字元輸入到記憶體中。所以,你根本就不用死記硬背,當你遇到IO的時候,就想兩件事,第一,我的記憶體是中心,第二看看流的方向(向量)!好吧,那麼往硬碟上寫檔案是out還是in呢?別一看到“寫”檔案你就說in,那是望文生義,你看,寫檔案的流向,是 記憶體---------->硬碟 記憶體為中心,到硬碟,OK 用out 那麼就是FileOutputStream、BufferedOutputStream
等等那讀檔案呢?是 記憶體<---------------硬碟 那麼就是in了 , 看清楚資料的流向就OK!那我訪問網路,看網頁是什麼呢 網路--------------->記憶體 是in 因為我們訪問頁面是要抓取該頁面得一個html檔案,那我要是在網路上輸入帳號密碼登陸呢? 是不是記憶體的東西要寫到該伺服器上呢,所以當然是out了!同樣socket編程用到更多的IO,這裡分別用Server(伺服器端)和Client(用戶端)來說明Server: 遇到請求,網路----->記憶體 IN 伺服器應答, 記憶體------->網路
OUT----------------------------------------------------------------------------------------------Client: 請求服務, 記憶體----->網路
OUT 伺服器應答, 網路------->記憶體 IN被搞糊塗了?那麼你先別想太多,只是想是記憶體的資料出去了就是out 外設的東西到記憶體了就IN了
InputStream之所以叫輸入類,是因為它要把要需要讀取的內容轉化成輸入資料流,再從它那裡進行讀取,而OutputStream之所以叫輸出類,是因為它首先需要與寫入的目的地相關聯,然後通過它進行寫入。輸入是:把要讀取的內容輸入到輸入資料流,在從輸入資料流進行讀取,所以是read()。輸出是:把要輸出的東西通過輸出資料流輸出到目的地,所以是write()。
1、在java中stream代表一種資料流(源),javaio的底層資料元,---(想像成水龍頭)
2、任何有能力產生資料流(源)的javaio對象就可以看作是一個InputStream對象
既然它能產生出資料,我們就可以將資料取出,java對封裝的通用方法就read()方法了--(出水龍頭)
3、任何有能力接收資料來源(流)的javaio對象我們就可以看作是一個OutputStream對象
同樣,它能接收資料,我們就可以調用它的write方法,來讓它接收資料--(進水龍頭了,呵呵)
4、當然,我們可以在Inputstream和OutputStream資料來源的基礎上,從實際需要觸發,
來重新封裝出不同效能機制的輸入、輸出資料流了,java.io包中提供了很豐富的輸入、輸出資料流對象,如:
基於位元組流的stream:
DataOutputStream----DataInputStream:
FileOutputStream-----FileInputStream:
.............等,可以用InputStream和OutputStream從JDK文檔查閱
基於字元流的stream(典型的以write和reader來標識的):
FileWriter---FileReader:
StringWriter---StringReader:
.........等,你自己可以用Writer和Reader從JDK文檔裡頭查看說明
stream應該是水龍頭裡的水資源,
InputStream:是一個出水龍頭(把水封裝在裡頭)的一個實物對象,該對象的read方法呢,就想成這個
出水龍頭這一機制對象的開關鈕,你read或openStream(其他對象包容InputStream對象的對象方法)一下呢,就等於開啟了出水龍頭的按鈕,水就出來了,裡頭封裝的水是什麼性質的呢,你就用相應的容器來裝,如string或byte[].....
OutputStream:你就在InputStream基礎上反著想就ok了
-------------------------------------------------------------------------------------------------------------------------
OutputStream
(1)輸出資料
void write(int b)往流中寫一個位元組b
void write(byte b[])往流中寫一個位元組數組b
void write(byte b[],int off,int len)把位元組數組b中從下標off開始,長度為len的位元組寫入流中
(2)
flush()刷空輸出資料流,並輸出所有被緩衝的位元組
由於某些流支援緩衝功能,該方法將把緩衝中所有內容強制輸出到流中。
(3)關閉流
close()流操作完畢後必須關閉。
------------------------------------------------------------------------------------------------------------------------
InputStream
(1)從流中讀取資料
int read() 讀取一個位元組,傳回值為所讀得位元組
int read(byte b[]) 讀取多個位元組,放置到位元組數組b中,通常讀取的位元組數量為b的長度,傳回值為實際獨取的
位元組的數量。
int read(byte b[] ,int off,int len)讀取len個位元組,放置到以下標off開始位元組數組b中,傳回值為實際
讀取的位元組的數量。
int available() 傳回值為流中尚未讀取的位元組的數量。
long skip(long n);讀指標跳過n個位元組不讀,傳回值為實際跳過的位元組數量
(2)關閉流
close() 流操作完畢後必須關閉
(3)使用輸入資料流中的標記
void mark(int readlimit)紀錄當前指標的所在位置.readlimit表示讀指標讀出的readlimit個位元組後
所標記的指標位置才實效。
void reset() 把讀指標重新指向用mark方法所記錄的位置
boolean markSupported() 當前的流是否支援讀指標的記錄功能。
-----------------------------------------------------------------------------------------------------------------------
Java IO 通過 Stream (流)來實現 。關於流,可以理解為是一種“資料的管道”。管道中流動的東西可以是基於位元組,也可以是基於字元的等。就好像管道裡面可以流動水,也可以流動石油一樣。
而對應於流還有一個概念:輸入、輸出裝置。這些裝置可以是磁碟檔案、鍵盤(輸入裝置)、顯示器(輸出裝置)、印表機(輸出裝置)、網路通訊端等等。
下面,我們就來瞭解 “流”。
Java 中定義了兩種類型的流:位元組型,和字元型。
位元組流:處理位元組的輸入和輸出。包括讀寫位元據等方面的內容。
字元流:處理字元的輸入和輸出。他採用的是 Unicode 編碼,可以實現國際化。使用字元流的另外一個好處就是:字元流比位元組流更有效率。
位元組流:
位元組流包含兩個頂層抽象類別: InputStream 和 OutputStream 。
1 :位元組流的兩個頂層類是抽象類別,分別是: InputStream 和 OutputStream 。
2 :每個抽象類別都有子類來實現具體的功能,處理不同的裝置的輸入和輸 出。
下面簡單介紹位元組流的幾個常用子類:::
位元組流類
功能簡單介紹
DataInputStream
包含了讀取 Java 標準資料類型的輸入資料流
DataOutputStream
包含了寫 Java 標準資料類型的輸出資料流
ByteArrayInputStream
從位元組數組讀取的輸入資料流
ByteArrayOutputStream
寫入位元組數組的輸出資料流
FileInputStream
從檔案讀入的輸入資料流
FileOutputStream
寫入檔案的輸出資料流
PrintStream
包含最常見的 Print ()和 Println ()的輸出資料流
PushbackInputStream
返回一個位元組到輸入資料流,主要用於編譯器的實現
PipedInputStream
輸出管道
PipedOutputStream
輸入管道
SequenceInputStream
將 n 個輸入資料流聯合起來,一個接一個按一定順序讀取
RandomAccessFile
隨機訪問檔案
BufferInputStream
緩衝輸入資料流
BufferOutputStream
緩衝輸出資料流
FilterInputStream
實現了 InputStream Interface
FilterOutputStream
實現了 OutputStream Interface
InputStream
抽象類別,描述流的輸入
OutputStream
抽象類別,描述流的輸入
抽象類別 InputStream 和 OutpurStream 定義了實用的方法,其中最主要的是 read ()和
write ()。這兩個方法在 InputStream 和 OutputStream 中聲明為抽象方法,由子流類 overwrite 實現。
2 :每個抽象類別都有子類來實現具體的功能,處理不同的裝置的輸入和輸 出。
下面簡單介紹位元組流的幾個常用子類:::
位元組流類
功能簡單介紹
DataInputStream
包含了讀取 Java 標準資料類型的輸入資料流
DataOutputStream
包含了寫 Java 標準資料類型的輸出資料流
ByteArrayInputStream
從位元組數組讀取的輸入資料流
ByteArrayOutputStream
寫入位元組數組的輸出資料流
FileInputStream
從檔案讀入的輸入資料流
FileOutputStream
寫入檔案的輸出資料流
PrintStream
包含最常見的 Print ()和 Println ()的輸出資料流
PushbackInputStream
返回一個位元組到輸入資料流,主要用於編譯器的實現
PipedInputStream
輸出管道
PipedOutputStream
輸入管道
SequenceInputStream
將 n 個輸入資料流聯合起來,一個接一個按一定順序讀取
RandomAccessFile
隨機訪問檔案
BufferInputStream
緩衝輸入資料流
BufferOutputStream
緩衝輸出資料流
FilterInputStream
實現了 InputStream Interface
FilterOutputStream
實現了 OutputStream Interface
InputStream
抽象類別,描述流的輸入
OutputStream
抽象類別,描述流的輸入
抽象類別 InputStream 和 OutpurStream 定義了實用的方法,其中最主要的是 read ()和
write ()。這兩個方法在 InputStream 和 OutputStream 中聲明為抽象方法,由子流類 overwrite 實現