Java精選筆記_IO流(字符輸入輸出流、字符文件輸入輸出流、字符流的緩沖區)


字符流

Reader是字符輸入流的基類,用於從某個源設備讀取字符

Writer是字符輸出流,用於向某個目標設備寫入字符

字符流操作文件

字符輸入流FileReader,通過此流可以從關聯的文件中讀取一個或一組字符。

在程序開發中,經常需要向文件中寫入字符,可以使用Writer的一個子類FileReader。

需求:在硬盤上,創建一個文件,並寫入一些文字數據。

用於操作操作文件的Writer的子類FileWriter,后綴名是父類名。前綴名是該流對象的功能。

操作步驟:

    1.創建一個FileWriter對象。該對象一被初始化就必須明確要被操作的文件,該文件會被創建到指定目錄下,如果該目錄下已經有同名文件,將被覆蓋

    FileWriter fw=new FileWriter("demo.txt");

    2.調用write方法,將字符串寫入到流中。

    fw.write();

    3.刷新流對象中的緩沖中的數據,將數據刷到目的地

    fw.flush();

    4.關閉流資源,但是關閉之前會刷新一次內部的緩沖中的數據,將數據刷到目的地中。和flush的區別,flush刷新后,流可以繼續使用,close刷新后將會將流關閉。

    fw.close();

字符文件輸入流FileReader

針對字符進行操作,而不是字節。它的間接父類是字符流Reader。FileWriter是用於寫入字符文件的便捷類。

在FileReader類中未自定義方法,而是繼承了其父類及間接父類中的方法。

構造方法

    public FileReader(File file)                 在給定從中讀取數據的File的情況下創建一個新類

    public FileReader(String fileName)    在給定從中讀取數據的文件名的情況下創建一個新類


字符文件輸出流FileWriter

構造方法

    FileWriter(File file)                              通過file對象創建FileWriter

    FileWriter(File file, boolean append)  通過file對象創建類,append為true或false表示是否在文件追加

    FileWriter(FileDescriptor fd)               參數fd為文件描述符,通過文件描述符創建FileWriter

    FileWriter(String fileName)                 參數fileName為文件路徑名,通過文件路徑創建FileWriter

    FileWriter(String fileName, boolean append) 


字符輸入流Reader

該類是抽象類,不能被實例化

方法
    abstract void close()             關閉輸入流

    void mark ()                           在輸入流中標記當前位置

    boolean markSupported ()    測試輸入流是否支持mark()和reset()方法

    int read ()                              從輸入流讀取下一字符

    int read (char[] cbuf)             從輸入流讀取若干字符數據,並存儲到字符數組

    abstract int read (char[] cbuf, int off, int len)       從輸入流讀取至多len個字符數據,並存儲到字符數組

    boolean void ready ()           判斷是否准備讀取輸入流

    void reset ()                          將輸入流重新定位到mark()方法標記的位置

    long skip (long n)                  跳過輸入流中n個字符數據


字符輸出流Writer

該類是抽象類,不能被實例化

方法

    abstract void close()                     關閉輸出流

    abstract void flush()                      刷新輸出流,強制將緩沖區內容寫入輸出流

    void write(char[] cbuf)                   將指定字符數組的內容寫入輸出流

    abstract void write(char[] cbuf,int off,int len)          將指定字符數組從off位置開始的len個字符寫入輸出流

    write(int c)                                    將指定的字符寫入輸出流

    write(String str)                            將指定的字符串寫入輸出流

    write(String str,int off,int len)        將指定字符串從off位置開始的len個字符寫入輸出流


字符流的緩沖區

字符流提供了帶緩沖區的包裝流,分別是BufferedReader和BufferedWriter,其中BufferedReader用於對字符輸入流進行包裝,BufferedWriter用於對字符輸出流進行包裝。

緩沖區的出現提高了對數據的讀寫效率

對應類:BUfferWriter 、BufferedReader

特點:緩沖區要結合流才可以使用,在創建緩沖區之前,必須要有流對象。在流的基礎上對流的功能進行了增強。


BufferedWriter步驟
    1.創建一個字符寫入流對象

        FileWriter fw=new FileWriter("a.txt");

    2.將需要被提高效率的流對象作為參數傳遞給緩沖區的構造函數

        bufferedWriter bufw=new BufferedWriter(fw);

        buff.write("asdasdas");

        bufw.newLine();//換行符,跨平台的

    3.將緩沖區刷新

        bufw.flush;

    4.關閉緩沖區,就是在關閉緩沖區中的流對象


BufferedReader步驟
    1.創建一個字符寫入流對象

        FileReader fr=new FileReader ("a.txt");

    2.將需要被提高效率的流對象作為參數傳遞給緩沖區的構造函數

        BufferedReader bufr=new BufferedReader (fr);

    3.讀取流對象:該緩沖區提供了一個一次讀取一行的方法。當返回null時表示,文件讀到末尾

        String line=null;

        while((line=bufr.readLine())!=null) {

        String s=line;}

    4.關閉

        bufr.close();

readLine()方法的原理:無論是讀一行,獲取多個字符,最終都是在硬盤上一個一個讀取,最終使用額還是read方法一次讀一個的方法。


通過緩沖區復制一個文件

    BufferWriter bufw=null;
    BufferReader bufr=null;
    try {
        bufw=new BufferWriter(new FileWriter("b.txt"));
        bufr=new BufferReader(new FileReader("a.txt"));
        String line=null;
        while ((line=buffr.read(buf))!=null){
            bufw.write(line);
            bufw.newLine();
            bufw.flsuh;
        }
    }catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }   
        try {
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


字符緩沖區輸入流BufferedReader

從字符輸入流中讀取文本,緩沖各個字符,從而提供字符、數組和行的高效讀取

構造方法

    public BufferedReader(Reader in)                創建一個使用默認大小輸入緩沖區的輸入流

    public BufferedReader(Reader in, int size)   創建一個使用size指定大小輸入緩沖區的輸入流


方法

    void close()                                 關閉該流

    void mark(int readAheadLimit)    標記流中的當前位置

    boolean markSupported()           判斷此流是否支持mark()操作

    int read()                                     讀取單個字符

    int read(char[] cbuf, int off, int len)         將字符讀入數組的某一部分

    String readLine()                         讀取一個文本行

    boolean ready()                          判斷此流是否已准備好被讀取

    void reset()                                 將流重置為最新的標記

    long skip(long n) 跳過字符

字符緩沖區輸出流BufferedWriter

將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。可以指定緩沖區的大小,或者接受默認的大小。

構造方法

    public BufferedWriter(Writer out)                創建一個使用默認大小輸出緩沖區的輸出流

    public BufferedWriter(Writer out, int size)   創建一個使用size指定大小輸出緩沖區的輸出流

方法

    void close()          關閉該輸出流

    void flush()           刷新該流的緩沖

    void newLine()     寫入一個行分隔符

    void write(char[] cbuf, int off,int len)     寫入字符數組的某一部分

    void write(int c)     寫入單個字符

    void write(String s,int off,int len)          寫入字符串的某一部分

文件的讀取

文件的讀取方式一:FileReader();

    1.創建一個FileReader對象。文件讀取流對象,和指定名稱的文件相關聯,要保證該文件是已經存在的,如果不存在會發生異常

    FileReader fr=new FileReader("demo.txt");

    2.調用讀取流的對象的read方法

        (1)int ch=fr.read();一次讀一個字符,會自動往下讀。

        (2)讀出所有字符 

     while((ch=fr.read())!=-1){

        System.out.println((char)ch);

     }

    3.關閉流資源,

    fr.close();


文件的讀取方式二:通過字符數組進行讀取

    1.創建一個FileReader對象。文件讀取流對象,和指定名稱的文件相關聯,要保證該文件是已經存在的,如果不存在會發生異常

    FileReader fr=new FileReader("demo.txt");

    2.定一個字符數組,用於存儲讀到字符,該rrad(char[])返回的是讀到的字符個數。

    char[] buf=new char[1024];一般定義1024-2個字節。

    int num=0;

    while((num=fr.read(buf))!=-1){

        System.out.println((new String(buf,0,num));

    }


文件的續寫

傳遞一個true參數,代表不覆蓋已有文件,並在已知文件的末尾處進行數據續寫。

FileWriter fw=new FileWriter("demo.txt",true);

換行轉義字符:\r\n


IO異常的處理方式
    FileWriter fw=null;

    try {

        fw=new FileWriter("demo.txt");

        fw.write("sdfasd");

    } catch (IOException e) {

        e.printStackTrace();

    }finally {

        try {

            if(fw!=null)

            fw.close();

        } catch (IOException e) {

            e.printStackTrace();

        }
}

}


ListNumberReader帶有行號的緩沖區
是BufferedReader的直接子類

     LineNumberReader lnr=new LineNumberReader();

    獲取行號:lnr.getLineNumber();

    設置行號從幾開始:lnr.setLineNumber(100);

    1.創建一個字符寫入流對象

        FileReader fr=new FileReader ("a.txt");

    2.將需要被提高效率的流對象作為參數傳遞給緩沖區的構造函數

        LineNumberReader lnfr=new LineNumberReader (fr);

    3.讀取流對象:該緩沖區提供了一個一次讀取一行的方法。當返回null時表示,文件讀到末尾

        String line=null;

        while((line=lnfr.readLine())!=null) {

            String s=line;

            String linenum=lnfr.getLineNumber();

        }

    4.關閉

        lnfr.close();

自定義帶行號的MyLineNumber

public class MyLineBufferReader extends MyBufferedReader {
    public MyLineBufferReader(Reader r) {
        super(r);
    }
    private int LineNumber;
    public int getLineNumber() {
        return LineNumber;
    }
    public void setLineNumber(int lineNumber) {
        LineNumber = lineNumber;
    }
    public String myReadLine() throws IOException {
        LineNumber++;
        return super.myReadLine();
    }
}


自定義一個功能和readline一致的方法,來模擬下BufferedReader()

public class MyBufferedReader extends Reader {
    private Reader r;
    public MyBufferedReader(Reader r) {
        super();
        this.r = r;
    }
    //可以一次讀取一行的方法
    public String myReadLine() throws IOException {
        //定義一個臨時容器。StringBulider容器,應用於存儲字符數組
        StringBuilder sb=new StringBuilder();
        int ch=0;
        while((ch=r.read())!=-1){
            if(ch=='\r')
                continue;
            if(ch=='\n')
                return sb.toString();
            else
                sb.append((char)ch);
        }
        if(sb.length()!=0)
            return sb.toString();
            return null;
        }
    }
}

讀取一個.java文件,並打印在控制台上

    FileReader fr=null;
    char[] buf=new char[1024];
    int num=0;
    try {
        fr= new FileReader("a.txt");
        try {
            while((num=fr.read(buf))!=-1) {
            System.out.print(new String(buf,0,num));
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            if(fr!=null)
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


將C盤的一個文本文件拷貝到D盤(數組相當於存儲之中的媒介)

步驟:
    1.新建一個文件用於存儲要被拷貝的文件
    2.定義讀取流和源文件關聯
    3.通不過不斷讀寫完成數據存儲
    4.關閉資源
    FileWriter fw=null;
FileReader fr=null;
    try {
        fw=new FileWriter("b.txt");
        fr=new FileReader("a.txt");
        char[] buf=new char[1024];
        int num=0;
        while ((num=fr.read(buf))!=-1) {
            fw.write(buf,0,num);
        }
    }catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }   
        try {
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM