Java.IO流類庫
在java.io包中有四個基本類:InputStream、OutputStream及Reader、Writer類,它們分別處理位元組流和字元流:
JDK1.4版本開始引入了新I/O類庫,它位於java.nio包中,新I/O類庫利用通道和緩衝區等來提高I/O操作的效率。
在java.io包中, java.io.InputStream 表示位元組輸入資料流, java.io.OutputStream表示位元組輸出資料流,處於java.io包最頂層。這兩個類均為抽象類別,也就是說它們不能被執行個體化,必鬚生成子類之後才能實現一定的功能。
二. io流的具體分類
(一)按I/O類型來總體分類:
1. Memory
1)從/向記憶體數組讀寫資料: CharArrayReader、 CharArrayWriter、ByteArrayInputStream、ByteArrayOutputStream
2)從/向記憶體字串讀寫資料 StringReader、StringWriter、StringBufferInputStream
2.Pipe管道
實現管道的輸入和輸出(處理序間通訊): PipedReader、PipedWriter、PipedInputStream、PipedOutputStream
3.File 檔案流
對檔案進行讀、寫操作 :FileReader、FileWriter、FileInputStream、FileOutputStream
4. ObjectSerialization
對象輸入、輸出 :ObjectInputStream、ObjectOutputStream
5.DataConversion資料流
按基礎資料型別 (Elementary Data Type)讀、寫(處理的資料是Java的基本類型(如布爾型,位元組,整數和浮點數)):DataInputStream、DataOutputStream
6.Printing
包含方便的列印方法 :PrintWriter、PrintStream
7.Buffering緩衝
在讀入或寫出時,對資料進行緩衝,以減少I/O的次數:BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream
8.Filtering 濾流
在資料進行讀或寫時進行過濾:FilterReader、FilterWriter、FilterInputStream、FilterOutputStream過
9.Concatenation合并輸入
把多個輸入資料流串連成一個輸入資料流 :SequenceInputStream
10.Counting計數
在讀入資料時對行記數 :LineNumberReader、LineNumberInputStream
11.Peeking Ahead
通過緩衝機制,進行預讀 :PushbackReader、PushbackInputStream
12.轉換流
位元組流轉字元流:InputStreamReader、OutputStreamWriter
(二)按資料來源(去向)分類:
1、File(檔案): FileInputStream, FileOutputStream, FileReader, FileWriter
2、byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、Char[]: CharArrayReader, CharArrayWriter
4、String: StringBufferInputStream, StringReader, StringWriter
5、網路資料流:InputStream, OutputStream, Reader, Writer
三、位元組流InputStream/OutputStream
1. InputStream抽象類別
InputStream 為位元組輸入資料流,它本身為一個抽象類別,必須依靠其子類實現各種功能,此抽象類別是表示位元組輸入資料流的所有類的超類。 繼承自InputStream 的流都是向程式中輸入資料的,且資料單位為位元組(8bit);
InputStream是輸入位元組資料用的類,所以InputStream類提供了3種重載的read方法.
Inputstream類中的常用方法:
(1) public abstract int read( ):讀取一個byte的資料,傳回值是高位補0的int類型值。若傳回值=-1說明沒有讀取到任何位元組讀取工作結束。
(2) public int read(byte b[ ]):讀取b.length個位元組的資料放到b數組中。傳回值是讀取的位元組數。該方法實際上是調用下一個方法實現的
(3) public int read(byte b[ ], int off, int len):從輸入資料流中最多讀取len個位元組的資料,存放到位移量為off的b數組中。
(4) public int available( ):返回輸入資料流中可以讀取的位元組數。注意:若輸入阻塞,當前線程將被掛起,如果InputStream對象調用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調用才有用,
(5) public long skip(long n):忽略輸入資料流中的n個位元組,傳回值是實際忽略的位元組數, 跳過一些位元組來讀取
(6) public int close( ) :我們在使用完後,必須對我們開啟的流進行關閉.
主要的子類:
1) FileInputStream把一個檔案作為InputStream,實現對檔案的讀取操作
2) ByteArrayInputStream:把記憶體中的一個緩衝區作為InputStream使用
3) StringBufferInputStream:把一個String對象作為InputStream
4) PipedInputStream:實現了pipe的概念,主要線上程中使用
5) SequenceInputStream:把多個InputStream合并為一個InputStream
2.OutputStream抽象類別
OutputStream提供了3個write方法來做資料的輸出,這個是和InputStream是相對應的。
1. public void write(byte b[ ]):將參數b中的位元組寫到輸出資料流。
2. public void write(byte b[ ], int off, int len) :將參數b的從位移量off開始的len個位元組寫到輸出資料流。
3. public abstract void write(int b) :先將int轉換為byte類型,把低位元組寫入到輸出資料流中。
4. public void flush( ) : 將資料緩衝區中資料全部輸出,並清空緩衝區。
5. public void close( ) : 關閉輸出資料流並釋放與流相關的系統資源。
主要的子類:
1) ByteArrayOutputStream:把資訊存入記憶體中的一個緩衝區中
2) FileOutputStream:把資訊存入檔案中
3) PipedOutputStream:實現了pipe的概念,主要線上程中使用
4) SequenceOutputStream:把多個OutStream合并為一個OutStream
流結束的判斷:方法read()的傳回值為-1時;readLine()的傳回值為null時。
3. 檔案輸入資料流: FileInputStream類
FileInputStream可以使用read()方法一次讀入一個位元組,並以int類型返回,或者是使用read()方法時讀入至一個byte數組,byte數組的元素有多少個,就讀入多少個位元組。在將整個檔案讀取完成或寫入完畢的過程中,這麼一個byte數組通常被當作緩衝區,因為這麼一個byte數組通常扮演承接資料的中間角色。
作用:以檔案作為資料輸入源的資料流。或者說是開啟檔案,從檔案讀資料到記憶體的類。
使用方法(1)
File fin=new File("d:/abc.txt");
FileInputStream in=new FileInputStream( fin);
使用方法(2)
FileInputStream in=new FileInputStream(“d: /abc.txt”);
程式舉例:
將InputFromFile.java的程式的內容顯示在顯示器上
import java.io.IOException; import java.io.FileInputStream; public class TestFile { public static void main(String args[]) throws IOException { try { FileInputStream rf = new FileInputStream("InputFromFile.java"); int n = 512; byte buffer[] = new byte[n]; while ((rf.read(buffer, 0, n) != -1) && (n > 0)) { System.out.println(new String(buffer)); } System.out.println(); rf.close(); } catch (IOException IOe) { System.out.println(IOe.toString()); } }
}
4.檔案輸出資料流:FileOutputStream類
作用:用來處理以檔案作為資料輸出目的資料流;或者說是從記憶體區讀資料入檔案
FileOutputStream類用來處理以檔案作為資料輸出目的資料流;一個表示檔案名稱的字串,也可以是File或FileDescriptor對象。
建立一個檔案流對象有兩種方法:
方式1:
File f=new File (“d:/myjava/write.txt ");
FileOutputStream out= new FileOutputStream (f);
方式2:
FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt ");
方式3:建構函式將 FileDescriptor()對象作為其參數。
FileDescriptor() fd=new FileDescriptor();
FileOutputStream f2=new FileOutputStream(fd);
方式4:建構函式將檔案名稱作為其第一參數,將布爾值作為第二參數。
FileOutputStream f=new FileOutputStream("d:/abc.txt",true);
注意:
(1)檔案中寫資料時,若檔案已經存在,則覆蓋存在的檔案;
(2)讀/寫操作結束時,應調用close方法關閉流。
程式舉例:使用鍵盤輸入一段文章,將文章儲存在檔案write.txt中
import java.io.IOException; import java.io.FileOutputStream; public class TestFile { public static void main(String args[]) throws IOException { &nb