java IO流java
1:概念
數組
java中的流,他的概念源於unix中管道(pipe)的概念,在unix中,管道是一條不間斷的字節流,用於實現程序或者進程之間的通訊,或者讀寫外圍設備,外圍文件等。
緩存
2:分類網絡
輸入輸出流:根據文件流的流向,分爲輸入流和輸出流,
編碼
字節流和字符流:針對處理的對象是字符仍是字節,分爲字符流和字節流,操作系統
字節流:通常讀入或讀出的是8位二進制數據,InputStream是全部字節輸入流的祖先,OutPutStream是全部輸出流的祖先。
unix
字符流:通常讀入或讀出的是16位二進制數據,Reader是全部讀取字符輸入流的祖先,Writer是全部字符輸出流的祖先。
code
結合上面所說的輸入輸出流,簡單分類,
視頻
字符流 字節流對象
輸入流 Reader InputStream
輸出流 Writer OutPutStream
節點流和處理流:節點流是在程序中直接和源文件相連,讀入或者讀出,處理流就是與節點流一塊使用,在節點流的基礎上再套上一層,套上的就是處理流
其中須要注意的是在日常操做中如何判斷使用字符流仍是字節流,字符流通常都是讀入或者讀出的單位是一個字符,通常遇到中文的就用字符流,由於中文一個字節裝不下,若是採用字節流,那麼讀入的將會是半個中文,操做系統不認識,只能顯示問號,遇到其餘圖片,媒體,視頻等就用字節流。通俗點就是遇到中文的就用字符流,其餘字節流。
3:詳解:
上面圖是一個簡單表關係,是上次從別人那看到不錯就粘貼過來了,很形象。下面就java中的字節流和字符流進行簡單的介紹:
java 中的字節流:
FileInputStream和FileOutPutStream
他們都是節點流,input流的源端和out的目的端都是磁盤文件,他們的構造方法容許經過文件的路徑名來構造相應的流
FileInputStream fis = new FileInputStream("c://123.txt");要注意的是123.txt文件必須存在並且要保證是可讀的。
FileOutPutStream fos = new FileOutPutStream("c://345.txt");若輸出文件已經存在了,那麼必須是能夠覆蓋的,若是不存在,則會建立。
BufferedInputStream和BufferedOutputStream,他們是帶有緩衝區的input和output,他們分別繼承了FileInputStream和FileOutPutStream,
java中的字符流:
字符流是主要用來處理字符的,java採用16位的Unicode來表示字符串和字符,對應的字符流的輸入和輸出分別是Reader和Writer,
其中FileReader和FileWriter分別繼承了Reader和Writer,屬於節點流
其中InputStreamReader和InputStreamWtirer,他們是處理流,協助節點流進行處理,在構造這兩個類的對應流時,他們會自動進行轉換,將平臺缺省的編碼格式設置爲Unicode編碼格式,對英文環境而言,缺省編碼格式爲ISO8859-1。
BufferedReader和BufferedWriter兩個類對應的流使用了緩衝,能大大提升輸入輸出的效率。他也是處理流。
其他還有不少對象,那些都是衍生出來的,針對數組,管道和對象操做的這裏就沒有詳談。
使用規則:
下面簡單介紹一下在那種狀況下使用那種流
1:根據文件:
文件:FileInputStream,FileOutPutStream(字節流),FileReader,FileWriter(字符流,帶中文)
byte[]:ByteArrayInputStream,ByteArrayOutPutStream(字節流)
char[]:CharArrayReader,CharArrayWriter(字符流)
String:StringBufferInputStream,StringBufferOutPutStream(字節流),StringWriter,StringReader(字符流)
網絡數據流:InputStream,OutPutStream(字符流),Reader,Writer(字符流)
2:按是否格式化輸出區分:
要格式化輸出:PrintStream,PrintWriter
3:按是否緩存區分:
BufferedInputStream,BufferedOutPutStream(字節流),BufferedReader,BufferWriter(字符流)
4:按照數據格式區分
二進制格式(只要不能肯定是純文本格式的)InputStream,OutPutStream以及Stream的子類
純文本格式(含英文以及中文或者其餘編碼格式)Reader,Wrtiter以及Reader,Writer的子類
5:輸入輸出區分
輸入流:Reader,InputStream的子類
輸出流:Writer,OutPutStream的子類
6:特殊需求區分:
從stream到Reader,Writer的轉換類:InputStreamReader,OutPutStreamReader
對象輸入輸出:ObjectInputStream,ObjectOutPutStream
進程之間通訊:PipeInputStream,PipeOutPutStream,PipeWriter,PipeReader
序列化的:SequenceInputStream
決定選取那種類以及他的構造進程規則通常以下:
首先考慮原始數據格式
其次考慮是輸入仍是輸出
在這考慮是否須要轉換流
還要考慮數據去向
考慮是否須要緩衝
以上只是我本身結合網上的一些整理的,若是有什麼不妥或者錯誤的地方,敬請指出,謝謝。