1. 程式人生 > >IO(輸入輸出)-字元流

IO(輸入輸出)-字元流

字元流定義及基本用法

如果希望在程式中操作字元。為此JDK提供了Reader和Writer。其中Reader是字元輸入流,用於從某個源裝置讀取字元,Writer是字元流出流,用於向某個目標裝置寫入字元。Reader和Writer作為字元流的頂級父類,也有許多子類。

這裡寫圖片描述

Reader子類

這裡寫圖片描述

Witer子類

字元流操作檔案

如果想從檔案中直接讀取字元便可以使用字元輸入流FileReader,通過此流可以從關聯的檔案 中讀取一個或者一組字元。

import java.io.FileReader;
import java.io.IOException;

public
class IOTest01 { private static FileReader fr; public static void main(String[] args) { // System.out.println(fr.toString().length()); try { /* 建立一個FileReader物件用來讀取檔案中的字元 */ fr = new FileReader("src/In.txt"); int len; //定義一個變數用於記錄讀取的字元。
/* 迴圈判斷是否讀到檔案的末尾 */ while ((len = fr.read()) != -1){ System.out.print((char)len); } } catch (Exception e) { e.printStackTrace(); }finally{ try { if(fr != null
){ //如果fr不為空就關閉 fr.close(); } } catch (IOException e) { e.printStackTrace(); } } } }

如果要向檔案中寫入字元就需要使用FileWriter類。

import java.io.FileWriter;
import java.io.IOException;

public class IOTest02 {

        public static void main(String[] args) throws IOException {

                /* 建立一個FileWriter物件用於向檔案中寫入資料 */
                FileWriter fw = new FileWriter("src/Out.txt");

                String str = "周林";  

                fw.write("\r\n");   //將輸出語句換行
                fw.write(str);      //將字元資料寫入到文字檔案中

                if(fw != null){
                        fw.close();     //關閉
                }
        }
}

字元流提供了帶緩衝區的包裝流,分別是BufferedReader和BufferedWriter。並且分別對輸入/輸出流進行包裝。

public class IOTest03 {

    public static void main(String[] args) throws IOException {

        /* 建立一個緩衝物件對FileReader進行包裝 */
        BufferedReader br = new BufferedReader(new FileReader("src/In.txt"));
        /* 建立一個緩衝物件對FileWriter進行包裝 */
        BufferedWriter bw = new BufferedWriter(new FileWriter("src/O.txt"));

        String src;

        long startTime = System.currentTimeMillis();

        /* readLine():每次讀取一行文字,判斷是否到檔案末尾  */
        while ((src = br.readLine()) != null ){
            bw.write(src);
            bw.newLine();   //寫入一個換行符,該方法會根據不同的作業系統生成相應的換行符。
        }
        long endTime = System.currentTimeMillis();

        System.out.println((endTime - startTime)+"毫秒");


        if(bw != null){
            bw.close();     //關閉
        }
        if(bw != null){
            bw.close();     //關閉
        }
    }
}

LineNumberReader

Java程式在編譯或執行期間經常會出現一些錯誤,在錯誤在通常會報告出錯的行號,為了方便查詢錯誤,需要在程式碼中加入行號。JDK提供了一個可以跟蹤行號的輸入流——LineNumberReader,它是BufferedReader的直接子類。
案例:為檔案加上行號。

public class IOTest04 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("src/In.txt");
        FileWriter fileWriter = new FileWriter("src/O.txt");

        /* 包裝 */
        LineNumberReader lnr = new LineNumberReader(fileReader);

        lnr.setLineNumber(0);       //設定讀取檔案的起始行號

        String len = null;

        while( (len = lnr.readLine() ) != null){
            /* 將行號寫入到檔案中 */
            fileWriter.write(lnr.getLineNumber()+":"+len);
            fileWriter.write("\r\n");       //寫入換行
        }
        lnr.close();
        fileWriter.close();
    }
}

轉換流

JKD中提供了兩個類可以將位元組流轉換為字元流,它們分別是InputStreamReader和OutputStreamWriter。
注意:在使用轉換流時,只能針對操作文字檔案的位元組流進行轉換,如果位元組流操作的是一張圖片,此時轉換為字元流就會造成資料丟失。

public class IOTest05 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("src/In.txt");
        InputStreamReader isr = new InputStreamReader(fis); //將位元組輸入流轉換成字元輸入流
        BufferedReader br = new BufferedReader(isr);    //對字元流物件進行包裝

        FileOutputStream fos = new FileOutputStream("src/Out.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);   //將字元輸出流轉換成字元輸出流
        BufferedWriter bw = new BufferedWriter(osw);    //對字元流物件進行包裝

        String len = null;

        while( (len = br.readLine() ) != null) {
            bw.write(len);
            bw.write("\r\n");
        }

        br.close();
        bw.close();
        }
}