流的概念java
Java程序經過流來完成輸入/輸出。流是生產或消費信息的抽象。流經過Java的輸入/輸出系統與物理設備連接。儘管與它們連接的物理設備不盡相同,全部流的行爲具備一樣的方式。這樣,相同的輸入/輸出類和方法適用於全部類型的外部設備。這意味着一個輸入流可以抽象多種不一樣類型的輸入:從磁盤文件,從鍵盤或從網絡套接字。一樣,一個輸出流能夠輸出到控制檯,磁盤文件或相連的網絡。流是處理輸入/輸出的一個潔淨的方法,例如它不須要代碼理解鍵盤和網絡的不一樣。Java中流的實現是在java.io包定義的類層次結構內部的。網絡
輸入/輸出流編碼
輸入/輸出時,數據在通訊通道中流動。所謂「數據流(stream)」指的是全部數據通訊通道之中,數據的起點和終點。信息的通道就是一個數據流。只要是數據從一個地方「流」到另一個地方,這種數據流動的通道均可以稱爲數據流。輸入/輸出是相對於程序來講的。程序在使用數據時所扮演的角色有兩個:一個是源,一個是目的。若程序是數據流的源,即數據的提供者,這個數據流對程序來講就是一個「輸出數據流」(數據從程序流出)。若程序是數據流的終點,這個數據流對程序而言就是一個「輸入數據流」(數據從程序外流向程序)spa
流的分類orm
在java.io包中提供了60多個類(流)。對象
從功能上分爲兩大類:輸入流(Input Stream)和輸出流(Output Stream)。可從中讀出一系列字節的對象稱爲輸入流。而能向其中寫入一系列字節的對象稱爲輸出流。內存
從流結構上可分爲字節流(以字節爲處理單位或稱面向字節)和字符流(以字符爲處理單位或稱面向字符)。it
字節流的輸入流和輸出流基礎是InputStream和OutputStream這兩個抽象類,字節流的輸入輸出操做由這兩個類的子類實現。字符流是Java1.1版後新增長的以字符爲單位進行輸入輸出io
處理的流,字符流輸入輸出的基礎是抽象類Reader和Writer。form
節點流:從特定的地方讀寫的流類,例如:磁盤或一塊內存區域。
過濾流:使用節點流做爲輸入或輸出。過濾流是使用一個已經存在的輸入流或輸出流鏈接建立的。
字節流/字符流
Java 2 定義了兩種類型的流:字節流和字符流。字節流(byte stream)爲處理字節的輸入和輸出提供了方便的方法。例如使用字節流讀取或寫入二進制數據。字符流(character stream)爲字符的輸入和輸出處理提供了方便。它們採用了統一的編碼標準,於是能夠國際化。固然,在某些場合,字符流比字節流更有效
Java的原始版本(Java 1.0)不包括字符流,所以全部的輸入和輸出都是以字節爲單位的。Java 1.1中加入了字符流的功能
須要聲明:在最底層,全部的輸入/輸出都是字節形式的。基於字符的流只爲處理字符提供方便有效的方法
字節流類(Byte Streams)字節流類用於向字節流讀寫8位二進制的字節。通常地,字節流類主要用於讀寫諸如圖象或聲音等的二進制數據。
字符流類(Character Streams)字符流類用於向字符流讀寫16位二進制字符。
讀數據的邏輯爲:
open a stream
while more information
read information
close the stream
寫數據的邏輯爲:
open a stream
while more information
write information
close the stream