1. 程式人生 > >java標準IO操作(二)

java標準IO操作(二)

java按照讀寫的資料單位將流劃分為兩大類
位元組流,字元流
位元組流是以位元組為單位讀寫資料的流,由於計算機底層都是2進位制,所以位元組流可以讀寫任意資料

字元流是以字元為單位讀寫資料的流,實際底層還是讀寫位元組
但是字元流會自動將位元組與字元進行對應的轉換工作,
因此字元流天生具備字元編解碼能力,對此字元流也僅適用於讀寫文字資料

java.io.Reader,java.io.Writer他們是所有字元輸入流
與字元輸出流的超類,規定了讀寫字元的相關方法

轉換流
java.io.InputStreamReader,java.io.OutputStreamWriter
它們是字元流常用的一堆實現類,同時也是一對高階流.在流連結中
起到非常重要的一環,承上啟下,銜接位元組流與其他字元流使用
轉換流是唯一一個可以與位元組流連線 的字元流
(因為低階流通常都是位元組流,而讀寫字元時我們會使用功能更多的字元高階流,而字元流通常只能連線其他字元流)

OutputStreamWriter演示

public class OSWDemo {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("OSW.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
        osw.write("兮兮");
        osw.write("黼黻");
        System.out
.println("寫出完畢"); osw.close(); } }

InputStreamReader演示

public class ISRDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("osw.txt");
        InputStreamReader isr = new InputStreamReader(fis,"gbk");
        /**
         * 字元流提供的讀取字元操作
         * int read()
         * 該方法會一次讀取一個字元,具體實際讀取了多少位元組取決於指定的字符集以及對應的字元(字元流會自行判定)
         * 讀取字元後還是以int形式返回,若該值為-1依然表示流讀取到了末尾.否則該資料表示的就是讀取到的對應字元,轉換為char即可
         */
int d = -1; while((d = isr.read())!=-1){ char c = (char)d; System.out.print(c); } isr.close(); } }

java.io.PrintWriter
具有自動行重新整理的緩衝字元輸出流,
特點是可以按行寫出字串,並且可以自動行重新整理

注:
java.io.BufferedWriter是緩衝字元輸出流,內部有緩衝區
可以進行塊寫操作提高效率,而PrintWriter就是通過連線它實現的緩衝功能(PW的很多構造方法內自動連線它)
PrintWriter演示

public class PWDemo {
    public static void main(String[] args) throws FileNotFoundException, IOException {
        /*
         * PW支援兩個直接對檔案寫操作的構造方法:
         * PrintWriter(File f)
         * PrintWriter(String path)
         * 
         * 以上兩種構造方法都支援一個過載,就是再傳入一個引數允許我們指定寫出字元時的字符集
         */
        PrintWriter pw = new PrintWriter("pw.txt","GBK");

        pw.println("A");
        pw.println("B");
        System.out.println("寫入完畢");

        pw.close();
    }
}

在流連結中使用PW

public class PWDemo2 {
    public static void main(String[] args) throws IOException {
        /*
         *使用流連結形式向檔案中 寫出字串
         */
        FileOutputStream fos = new FileOutputStream("pw2.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk");
        BufferedWriter bw = new BufferedWriter(osw);
        PrintWriter pw = new PrintWriter(bw);

    /*  PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(FileOutputStream("pw2.txt"),"gbk")));*/
        pw.println("a");
        pw.println("b");
        System.out.println("over");
        pw.close();


    }
}

java.io.BufferedReader
緩衝字元輸入流
特點:可以按行讀取字串
BufferedReader演示

public class BRDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src/io/BRDemo.java");
        InputStreamReader isr = new InputStreamReader(fis,"GBK");
        BufferedReader br = new BufferedReader(isr);
        /*
         * String readLine()
         * 連續讀取若干字元,知道讀取到了換行符為止,然後將換行符之前的所有字元組成一個字串返回
         * 注意:返回的字串中不包含最後讀取到的換行符
         * 當讀到了末尾,則返回null.
         */
        String line = null;
        while((line = br.readLine())!= null){
            System.out.println(line);
        }
        br.close();
    }
}

完成簡易記事本功能

public class Note {
    public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {
    Scanner sc = new Scanner(System.in);
    System.out.println("請輸入檔名:");
    String fileName = sc.nextLine();

    /*
     * 當建立PW時第一個引數為一個流時,那麼就可以再傳入一個boolean值型別引數
     * 若該值為true.那麼當前PW就具有了自動行重新整理功能,即:
     * 每當使用println方法寫出一行字串後就會自動flush
     * 
     * 注:使用自動行重新整理可以提高寫出資料的即時性,但是由於會提高寫出次數,必然導致寫效率降低
     * 
     */
        PrintWriter pw = new PrintWriter(
                new BufferedWriter(
                        new OutputStreamWriter(
                                new FileOutputStream(fileName),"GBK"
                                )
                        ),true  //開啟自動行重新整理功能     不需要之後使用flush方法   
                );
        System.out.println("請輸入內容(鍵入exit程式退出):");
        String str;
        while(true){
            str = sc.nextLine();
            if("exit".equals(str.toLowerCase())){
                break;
            }
            pw.println(str);
            // pw.flush();

        }
        System.out.println("再見");

        sc.close();
        pw.close();
    }
}