IO流的分類
· 根據處理數據類型的不同分爲:字符流和字節流
· 根據數據流向不同分爲:輸入流和輸出流
· 按數據來源(去向)分類:
1、File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
2、byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、Char[]: CharArrayReader,CharArrayWriter
4、String:StringBufferInputStream, StringReader, StringWriter
5、網絡數據流:InputStream,OutputStream, Reader, Writer
字符流和字節流
流序列中的數據既可以是未經加工的原始二進制數據,也可以是經一定編碼處理後符合某種格式規定的特定數據。因此Java中的流分爲兩種:
1) 字節流:數據流中最小的數據單元是字節
2) 字符流:數據流中最小的數據單元是字符, Java中的字符是Unicode編碼,一個字符佔用兩個字節。
字符流的由來: Java中字符是採用Unicode標準,一個字符是16位,即一個字符使用兩個字節來表示。爲此,JAVA中引入了處理字符的流。因爲數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼錶。
字節流和字符流的區別:(詳細可以參見http://blog.csdn.net/qq_25184739/article/details/51203733)
字節流沒有緩衝區,是直接輸出的,而字符流是輸出到緩衝區的。因此在輸出時,字節流不調用colse()方法時,信息已經輸出了,而字符流只有在調用close()方法關閉緩衝區時,信息才輸出。要想字符流在未關閉時輸出信息,則需要手動調用flush()方法。
· 讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。
· 處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。
結論:只要是處理純文本數據,就優先考慮使用字符流。除此之外都使用字節流。
字符流與字節流轉換
轉換流的特點:
1. 其是字符流和字節流之間的橋樑
2. 可對讀取到的字節數據經過指定編碼轉換成字符
3. 可對讀取到的字符數據經過指定編碼轉換成字節
何時使用轉換流?
1. 當字節和字符之間有轉換動作時;
2. 流操作的數據需要編碼或解碼時。
具體的對象體現:
轉換流:在IO中還存在一類是轉換流,將字節流轉換爲字符流,同時可以將字符流轉化爲字節流。
1. InputStreamReader:字節到字符的橋樑
2. OutputStreamWriter:字符到字節的橋樑
OutputStreamWriter(OutStreamout):將字節流以字符流輸出。
InputStreamReader(InputStream in):將字節流以字符流輸入。
這兩個流對象是字符體系中的成員,它們有轉換作用,本身又是字符流,所以在構造的時候需要傳入字節流對象進來。
1.輸入字節流InputStream
1. InputStream是所有的輸入字節流的父類,它是一個抽象類。
2. ByteArrayInputStream、StringBufferInputStream、FileInputStream是三種基本的介質流,它們分別從Byte數組、StringBuffer、和本地文件中讀取數據。
3. PipedInputStream是從與其它線程共用的管道中讀取數據.
4. ObjectInputStream和所有FilterInputStream的子類都是裝飾流(裝飾器模式的主角)。
InputStream中的三個基本的讀方法
abstract int read() :讀取一個字節數據,並返回讀到的數據,如果返回-1,表示讀到了輸入流的末尾。
int read(byte[] b) :將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。
int read(byte[]?b, int off, int len) :將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。off指定在數組b中存放數據的起始偏移位置;len指定讀取的最大字節數。
流結束的判斷:方法read()的返回值爲-1時;readLine()的返回值爲null時。
2.輸出字節流OutputStream
1. OutputStream是所有的輸出字節流的父類,它是一個抽象類。
2. ByteArrayOutputStream、FileOutputStream是兩種基本的介質流,它們分別向Byte數組、和本地文件中寫入數據。PipedOutputStream是向與其它線程共用的管道中寫入數據。
3. ObjectOutputStream和所有FilterOutputStream的子類都是裝飾流。
outputStream中的三個基本的寫方法
abstract void write(int?b):往輸出流中寫入一個字節。
void write(byte[]?b) :往輸出流中寫入數組b中的所有字節。
void write(byte[]?b, int?off, int?len) :往輸出流中寫入數組b中從偏移量off開始的len個字節的數。
void flush() :刷新輸出流,強制緩衝區中的輸出字節被寫出。
void close() :關閉輸出流,釋放和這個流相關的系統資源。注:所有流都應該在結束時釋放。
3.字符輸入流Reader
1. Reader是所有的輸入字符流的父類,它是一個抽象類。
2. CharReader、StringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據。PipedReader是從與其它線程共用的管道中讀取數據。
3. BufferedReader很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader對象。
主要方法:
(1) public int read() throws IOException; //讀取一個字符,返回值爲讀取的字符
(2) public int read(char cbuf[]) throws IOException; /*讀取一系列字符到數組cbuf[]中,返回值爲實際讀取的字符的數量*/
(3) public abstract int read(char cbuf[],int off,int len) throws IOException;
/*讀取len個字符,從數組cbuf[]的下標off處開始存放,返回值爲實際讀取的字符數量,該方法必須由子類實現*/
4.字符輸出流Writer
1. Writer是所有的輸出字符流的父類,它是一個抽象類。
2. CharArrayWriter、StringWriter是兩種基本的介質流,它們分別向Char數組、String中寫入數據。PipedWriter是向與其它線程共用的管道中寫入數據,
3. BufferedWriter是一個裝飾器爲Writer提供緩衝功能。
主要方法:
(1) public void write(int c) throws IOException; //將整型值c的低16位寫入輸出流
(2) public void write(char cbuf[]) throws IOException; //將字符數組cbuf[]寫入輸出流
(3) public abstract void write(char cbuf[],int off,int len) throws IOException; //將字符數組cbuf[]中的從索引爲off的位置處開始的len個字符寫入輸出流
(4) public void write(String str) throws IOException; //將字符串str中的字符寫入輸出流
(5) public void write(String str,int off,int len) throws IOException; //將字符串str 中從索引off開始處的len個字符寫入輸出流
8.非流式文件類--File類
File類是Object的直接子類,同時它繼承了Comparable接口可以進行數組的排序。File類共提供了三個不同的構造函數,以不同的參數形式靈活地接收文件和目錄名信息。
構造函數:
1)File (String pathname)
例:File f1=new File("FileTest1.txt"); //創建文件對象f1,f1所指的文件是在當前目錄下創建的FileTest1.txt
2)File (String parent , String child)
例:File f2=new File(“D:\\dir1","FileTest2.txt") ;// 注意:D:\\dir1目錄事先必須存在,否則異常
3)File (File parent , String child)
例:File f4=new File("\\dir3");
File f5=new File(f4,"FileTest5.txt"); //在如果 \\dir3目錄不存在使用f4.mkdir()先創建
一個對應於某磁盤文件或目錄的File對象一經創建, 就可以通過調用它的方法來獲得文件或目錄的屬性。
1)public boolean exists( ) 判斷文件或目錄是否存在
2)public boolean isFile( ) 判斷是文件還是目錄
3)public boolean isDirectory( ) 判斷是文件還是目錄
4)public String getName( ) 返回文件名或目錄名
5)public String getPath( ) 返回文件或目錄的路徑。
6)public long length( ) 獲取文件的長度
7)public String[ ] list ( ) 將目錄中所有文件名保存在字符串數組中返回。
File類中還定義了一些對文件或目錄進行管理、操作的方法,常用的方法有:
1) public boolean renameTo( File newFile ); 重命名文件
2) public void delete( ); 刪除文件
3) public boolean mkdir( ); 創建目錄
9.RandomAccessFile類
1. 該對象只能操作文件,所以構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。
2. 該對象既可以對文件進行讀操作,也能進行寫操作,在進行對象實例化時可指定操作模式(r,rw)
10、System類對IO的支持,
Java語言系統預定了3個可以直接使用的流對象,分別是:
System.in(標準輸入),通常代表鍵盤輸入。
System.out(標準輸出):通常寫往顯示器。
System.err(標準錯誤輸出):通常寫往顯示器。
注意:
(1)System類不能創建對象,只能直接使用它的三個靜態成員。
(2)每當main方法被執行時,就自動生成上述三個對象。
1) 標準輸出流 System.out
System.out向標準輸出設備輸出數據,其數據類型爲PrintStream。方法:
Void print(參數)
Void println(參數)
2)標準輸入流 System.in
System.in讀取標準輸入設備數據(從標準輸入獲取數據,一般是鍵盤),其數 據類型爲InputStream。方法:
int read() //返回ASCII碼。若,返回值=-1,說明沒有讀取到任何字節讀取工作結束。
int read(byte[] b)//讀入多個字節到緩衝區b中返回值是讀入的字節數
3)標準錯誤流
System.err輸出標準錯誤,其數據類型爲PrintStream。可查閱API獲得詳細說明。
另外
標準輸出通過System.out調用println方法輸出參數並換行,而print方法輸出參數但不換行。println或print方法都通 過重載實現了輸出基本數據類型的多個方法,包括輸出參數類型爲boolean、char、int、long、float和double。同時,也重載實現
了輸出參數類型爲char[]、String和Object的方法。其中,print(Object)和println(Object)方法在運行時將調 用參數Object的toString方法。
附加:
IOException異常類的子類
1.public class EOFException : 非正常到達文件尾或輸入流尾時,拋出這種類型的異常。
2.public class FileNotFoundException: 當文件找不到時,拋出的異常。
3.public class InterruptedIOException: 當I/O操作被中斷時,拋出這種類型的異常。