1.什麼是IO
Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基于資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列。Java的I/O流提供了讀寫資料的标準方法。任何Java中表示資料源的對象都會提供以資料流的方式讀寫它的資料的方法。
Java.io是大多數面向資料流的輸入/輸出類的主要軟體包。此外,Java也對塊傳輸提供支援,在核心庫 java.nio中采用的便是塊IO。
流IO的好處是簡單易用,缺點是效率較低。塊IO效率很高,但程式設計比較複雜。
Java IO模型 :
Java的IO模型設計非常優秀,它使用Decorator模式,按功能劃分Stream,您可以動态裝配這些Stream,以便獲得您需要的功能。例如,您需要一個具有緩沖的檔案輸入流,則應當組合使用FileInputStream和BufferedInputStream。
2.資料流的基本概念
資料流是一串連續不斷的資料的集合,就象水管裡的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。資料寫入程式可以是一段、一段地向資料流管道中寫入資料,這些資料段會按先後順序形成一個長的資料流。對資料讀取程式來說,看不到資料流在寫入時的分段情況,每次可以讀取其中的任意長度的資料,但隻能先讀取前面的資料後,再讀取後面的資料。不管寫入時是将資料分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全一樣的。
“流是磁盤或其它外圍裝置中存儲的資料的源點或終點。”
在電腦上的資料有三種存儲方式,一種是外存,一種是記憶體,一種是緩存。比如電腦上的硬碟,磁盤,U盤等都是外存,在電腦上有記憶體條,緩存是在CPU裡面的。外存的存儲量最大,其次是記憶體,最後是緩存,但是外存的資料的讀取最慢,其次是記憶體,緩存最快。這裡總結從外存讀取資料到記憶體以及将資料從記憶體寫到外存中。對于記憶體和外存的了解,我們可以簡單的了解為容器,即外存是一個容器,記憶體又是另外一個容器。那又怎樣把放在外存這個容器内的資料讀取到記憶體這個容器以及怎麼把記憶體這個容器裡的資料存到外存中呢?
在Java類庫中,IO部分的内容是很龐大的,因為它涉及的領域很廣泛:
标準輸入輸出,檔案的操作,網絡上的資料流,字元串流,對象流,zip檔案流等等,java中将輸入輸出抽象稱為流,就好像水管,将兩個容器連接配接起來。将資料沖外存中讀取到記憶體中的稱為輸入流,将資料從記憶體寫入外存中的稱為輸出流。
流是一個很形象的概念,當程式需要讀取資料的時候,就會開啟一個通向資料源的流,這個資料源可以是檔案,記憶體,或是網絡連接配接。類似的,當程式需要寫入資料的時候,就會開啟一個通向目的地的流。
總結的基本概念如下:
1) 資料流:
一組有序,有起點和終點的位元組的資料序列。包括輸入流和輸出流。
2) 輸入流(Input Stream):
程式從輸入流讀取資料源。資料源包括外界(鍵盤、檔案、網絡…),即是将資料源讀入到程式的通信通道
3) 輸出流:
程式向輸出流寫入資料。将程式中的資料輸出到外界(顯示器、列印機、檔案、網絡…)的通信通道。
采用資料流的目的就是使得輸出輸入獨立于裝置。
Input Stream不關心資料源來自何種裝置(鍵盤,檔案,網絡)
Output Stream不關心資料的目的是何種裝置(鍵盤,檔案,網絡)
4 資料流分類:
流序列中的資料既可以是未經加工的原始二進制資料,也可以是經一定編碼處理後符合某種格式規定的特定資料。是以Java中的流分為兩種:
1) 位元組流:資料流中最小的資料單元是位元組
2) 字元流:資料流中最小的資料單元是字元, Java中的字元是Unicode編碼,一個字元占用兩個位元組。
3. 标準I/O
Java程式可通過指令行參數與外界進行簡短的資訊交換,同時,也規定了與标準輸入、輸出裝置,如鍵盤、顯示器進行資訊交換的方式。而通過檔案可以與外界進行任意資料形式的資訊交換。
1. 指令行參數
- public class TestArgs {
- public static void main(String[] args) {
- for (int i = 0; i < args.length; i++) {
- System.out.println("args[" + i + "] is <" + args[i] + ">");
- }
- }
- }
運作指令:java Java C VB
運作結果:
args[0] is <Java>
args[1] is <C>
args[2] is <VB>
2. 标準輸入,輸出資料流
java系統自帶的标準資料流:java.lang.System:
- java.lang.System
- public final class System extends Object{
- static PrintStream err;//标準錯誤流(輸出)
- static InputStream in;//标準輸入(鍵盤輸入流)
- static PrintStream out;//标準輸出流(顯示器輸出流)
- }
注意:
(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中傳回值是讀入的位元組數 例如:
- import java.io.*;
- public class StandardInputOutput {
- public static void main(String args[]) {
- int b;
- try {
- System.out.println("please Input:");
- while ((b = System.in.read()) != -1) {
- System.out.print((char) b);
- }
- } catch (IOException e) {
- System.out.println(e.toString());
- }
- }
- }
等待鍵盤輸入,鍵盤輸入什麼,就列印出什麼:
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方法。
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class StandardInputOutput {
- public static void main(String args[]) {
- String s;
- // 建立緩沖區閱讀器從鍵盤逐行讀入資料
- InputStreamReader ir = new InputStreamReader(System.in);
- BufferedReader in = new BufferedReader(ir);
- System.out.println("Unix系統: ctrl-d 或 ctrl-c 退出"
- + "\nWindows系統: ctrl-z 退出");
- try {
- // 讀一行資料,并标準輸出至顯示器
- s = in.readLine();
- // readLine()方法運作時若發生I/O錯誤,将抛出IOException異常
- while (s != null) {
- System.out.println("Read: " + s);
- s = in.readLine();
- }
- // 關閉緩沖閱讀器
- in.close();
- } catch (IOException e) { // Catch any IO exceptions.
- e.printStackTrace();
- }
- }
- }
4.java.IO層次體系結構
在整個Java.io包中最重要的就是5個類和一個接口。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個接口指的是Serializable.掌握了這些IO的核心操作那麼對于Java中的IO體系也就有了一個初步的認識了
Java I/O主要包括如下幾個層次,包含三個部分:
1.流式部分――IO的主體部分;
2.非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;
3.其他類--檔案讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地作業系統相關的檔案系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。
主要的類如下:
1. File(檔案特征與管理):用于檔案或者目錄的描述資訊,例如生成新目錄,修改檔案名,删除檔案,判斷檔案所在路徑等。
2. InputStream(二進制格式操作):抽象類,基于位元組的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特征。
3. OutputStream(二進制格式操作):抽象類。基于位元組的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特征。
Java中字元是采用Unicode标準,一個字元是16位,即一個字元使用兩個位元組來表示。為此,JAVA中引入了處理字元的流。
4. Reader(檔案格式操作):抽象類,基于字元的輸入操作。
5. Writer(檔案格式操作):抽象類,基于字元的輸出操作。
6. RandomAccessFile(随機檔案操作):它的功能豐富,可以從檔案的任意位置進行存取(輸入輸出)操作。
Java中IO流的體系結構如圖:
5. 非流式檔案類--File類
在Java語言的java.io包中,由File類提供了描述檔案和目錄的操作與管理方法。但File類不是InputStream、OutputStream或Reader、Writer的子類,因為它不負責資料的輸入輸出,而專門用來管理磁盤檔案與目錄。
作用:File類主要用于命名檔案、查詢檔案屬性和處理檔案目錄。
- public class File extends Object
- implements Serializable,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( ); 建立目錄
例子:
- import java.io.File;
- import java.io.IOException;
- public class TestFile {
- public static void main(String args[]) throws IOException {
- File dir = new File("\\root");
- File f1 = new File(dir, "fileOne.txt");
- File f2 = new File(dir, "fileTwo.java");
- // 檔案對象建立後,指定的檔案或目錄不一定實體上存在
- if (!dir.exists())
- dir.mkdir();
- if (!f1.exists())
- f1.createNewFile();
- if (!f2.exists())
- f2.createNewFile();
- System.out.println("f1's AbsolutePath= " + f1.getAbsolutePath());
- System.out.println("f1 Canread=" + f1.canRead());
- System.out.println("f1's len= " + f1.length());
- String[] FL;
- int count = 0;
- FL = dir.list();
- for (int i = 0; i < FL.length; i++) {
- count++;
- System.out.println(FL[i] + "is in \\root");
- }
- System.out.println("there are" + count + "file in //root");
- }
- }
說明:File類的方法:
(1) exists()測試磁盤中指定的檔案或目錄是否存在
(2) mkdir()建立檔案對象指定的目錄(單層目錄)
(3) createNewFile()建立檔案對象指定的檔案
(4) list()傳回目錄中所有檔案名字元串
6. Java.IO流類庫
1. io流的四個基本類
java.io包中包含了流式I/O所需要的所有類。在java.io包中有四個基本類:InputStream、OutputStream及Reader、Writer類,它們分别處理位元組流和字元流:
基本資料流的I/O
輸入/輸出 | 位元組流 | 字元流 |
輸入流 | Inputstream | Reader |
輸出流 | OutputStream | Writer |
Java中其他多種多樣變化的流均是由它們派生出來的:
JDK1.4版本開始引入了新I/O類庫,它位于java.nio包中,新I/O類庫利用通道和緩沖區等來提高I/O操作的效率。
在java.io包中, java.io.InputStream 表示位元組輸入流, java.io.OutputStream表示位元組輸出流,處于java.io包最頂層。這兩個類均為抽象類,也就是說它們不能被執行個體化,必須生成子類之後才能實作一定的功能。
1. 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資料流 按基本資料類型讀、寫(處理的資料是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.Converting between Bytes and Characters 按照一定的編碼/解碼标準将位元組流轉換為字元流,或進行反向轉換(Stream到Reader,Writer的轉換類):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
7. 位元組流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 {
- try {
- System.out.println("please Input from Keyboard");
- int count, n = 512;
- byte buffer[] = new byte[n];
- count = System.in.read(buffer);
- FileOutputStream wf = new FileOutputStream("d:/myjava/write.txt");
- wf.write(buffer, 0, count);
- wf.close(); // 當流寫操作結束時,調用close方法關閉流。
- System.out.println("Save to the write.txt");
- } catch (IOException IOe) {
- System.out.println("File Write Error!");
- }
- }
- }
5. FileInputStream流和FileOutputStream的應用
利用程式将檔案file1.txt 拷貝到file2.txt中。
- import java.io.File;
- import java.io.IOException;
- import java.io.FileOutputStream;
- import java.io.FileInputStream;
- public class TestFile {
- public static void main(String args[]) throws IOException {
- try {
- File inFile = new File("copy.java");
- File outFile = new File("copy2.java");
- FileInputStream finS = new FileInputStream(inFile);
- FileOutputStream foutS = new FileOutputStream(outFile);
- int c;
- while ((c = finS.read()) != -1) {
- foutS.write(c);
- }
- finS.close();
- foutS.close();
- } catch (IOException e) {
- System.err.println("FileStreamsTest: " + e);
- }
- }
- }
6. 緩沖輸入輸出流 BufferedInputStream/ BufferedOutputStream
計算機通路外部裝置非常耗時。通路外存的頻率越高,造成CPU閑置的機率就越大。為了減少通路外存的次數,應該在一次對外設的通路中,讀寫更多的資料。為此,除了程式和流節點間交換資料必需的讀寫機制外,還應該增加緩沖機制。緩沖流就是每一個資料流配置設定一個緩沖區,一個緩沖區就是一個臨時存儲資料的記憶體。這樣可以減少通路硬碟的次數,提高傳輸效率。
BufferedInputStream:當向緩沖流寫入資料時候,資料先寫到緩沖區,待緩沖區寫滿後,系統一次性将資料發送給輸出裝置。
BufferedOutputStream :當從向緩沖流讀取資料時候,系統先從緩沖區讀出資料,待緩沖區為空時,系統再從輸入裝置讀取資料到緩沖區。
1)将檔案讀入記憶體:
将BufferedInputStream與FileInputStream相接
FileInputStream in=new FileInputStream( “file1.txt ” );
BufferedInputStream bin=new BufferedInputStream( in);
2)将記憶體寫入檔案:
将BufferedOutputStream與 FileOutputStream相接
FileOutputStreamout=new FileOutputStream(“file1.txt”);
BufferedOutputStream bin=new BufferedInputStream(out);
3)鍵盤輸入流讀到記憶體 将 BufferedReader 與 标準的資料流 相接 InputStreamReader sin=new InputStreamReader ( System.in) ; BufferedReader bin=new BufferedReader( sin);
- import java.io.*;
- public class ReadWriteToFile {
- public static void main(String args[]) throws IOException {
- InputStreamReader sin = new InputStreamReader(System.in);
- BufferedReader bin = new BufferedReader(sin);
- FileWriter out = new FileWriter("myfile.txt");
- BufferedWriter bout = new BufferedWriter(out);
- String s;
- while ((s = bin.readLine()).length() > 0) {
- bout.write(s, 0, s.length());
- }
- }
- }
程式說明:
從鍵盤讀入字元,并寫入到檔案中 BufferedReader類的方法: String readLine()
作用:讀一行字元串,以回車符為結束。
BufferedWriter類的方法: bout.write(String s,offset,len)
作用:從緩沖區将字元串s從offset開始,len長度的字元串寫到某處。
8. 字元流Writer/Reader
Java中字元是采用Unicode标準,一個字元是16位,即一個字元使用兩個位元組來表示。為此,JAVA中引入了處理字元的流。
1. Reader抽象類
用于讀取字元流的抽象類。子類必須實作的方法隻有 read(char[], int, int) 和 close()。但是,多數子類将重寫此處定義的一些方法,以提供更高的效率和/或其他功能。
1) FileReader :與FileInputStream對應
主要用來讀取字元檔案,使用預設的字元編碼,有三種構造函數:
(1)将檔案名作為字元串 :FileReader f=new FileReader(“c:/temp.txt”);
(2)構造函數将File對象作為其參數。
File f=new file(“c:/temp.txt”);
FileReader f1=new FileReader(f);
(3) 構造函數将FileDescriptor對象作為參數
FileDescriptor() fd=new FileDescriptor()
FileReader f2=new FileReader(fd);
(1) 用指定字元數組作為參數:CharArrayReader(char[])
(2) 将字元數組作為輸入流:CharArrayReader(char[], int, int)
讀取字元串,構造函數如下: public StringReader(String s);
2) CharArrayReader:與ByteArrayInputStream對應
3) StringReader : 與StringBufferInputStream對應
4) InputStreamReader
從輸入流讀取位元組,在将它們轉換成字元:Public inputstreamReader(inputstream is);
5) FilterReader: 允許過濾字元流
protected filterReader(Reader r);
6) BufferReader :接受Reader對象作為參數,并對其添加字元緩沖器,使用readline()方法可以讀取一行。
Public BufferReader(Reader r);
主要方法:
(1) public int read() throws IOException; //讀取一個字元,傳回值為讀取的字元
(2) public int read(char cbuf[]) throws IOException;
(3) public abstract int read(char cbuf[],int off,int len) throws IOException;
2. Writer抽象類
寫入字元流的抽象類。子類必須實作的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類将重寫此處定義的一些方法,以提供更高的效率和/或其他功能。 其子類如下:
1) FileWrite: 與FileOutputStream對應
将字元類型資料寫入檔案,使用預設字元編碼和緩沖器大小。
Public FileWrite(file f);
2) chararrayWrite:與ByteArrayOutputStream對應 ,将字元緩沖器用作輸出。
Public CharArrayWrite();
3) PrintWrite:生成格式化輸出
public PrintWriter(outputstream os);
4) filterWriter:用于寫入過濾字元流
protected FilterWriter(Writer w);
5) PipedWriter:與PipedOutputStream對應
6) StringWriter:無與之對應的以位元組為導向的stream
主要方法:
(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個字元寫入輸出流
(6) flush( ) //刷空輸出流,并輸出所有被緩存的位元組。
(7)close() 關閉流 public abstract void close() throws IOException
3 .InputStream與Reader差别 OutputStream與Writer差别
InputStream和OutputStream類處理的是位元組流,資料流中的最小機關是位元組(8個bit)
Reader與Writer處理的是字元流,在處理字元流時涉及了字元編碼的轉換問題
- import java.io.*;
- public class EncodeTest {
- private static void readBuff(byte [] buff) throws IOException {
- ByteArrayInputStream in =new ByteArrayInputStream(buff);
- int data;
- while((data=in.read())!=-1) System.out.print(data+" ");
- System.out.println(); in.close(); }
- public static void main(String args[]) throws IOException {
- System.out.println("記憶體中采用unicode字元編碼:" );
- char c='好';
- int lowBit=c&0xFF; int highBit=(c&0xFF00)>>8;
- System.out.println(""+lowBit+" "+highBit);
- String s="好";
- System.out.println("本地作業系統預設字元編碼:");
- readBuff(s.getBytes());
- System.out.println("采用GBK字元編碼:");
- readBuff(s.getBytes("GBK"));
- System.out.println("采用UTF-8字元編碼:");
- readBuff(s.getBytes("UTF-8")); }
- }
Reader類能夠将輸入流中采用其他編碼類型的字元轉換為Unicode字元,然後在記憶體中為其配置設定記憶體
Writer類能夠将記憶體中的Unicode字元轉換為其他編碼類型的字元,再寫到輸出流中。
9. IOException異常類的子類
1.public class EOFException :
非正常到達檔案尾或輸入流尾時,抛出這種類型的異常。
2.public class FileNotFoundException:
當檔案找不到時,抛出的異常。
3.public class InterruptedIOException:
當I/O操作被中斷時,抛出這種類型的異常。