1. 程式人生 > >Java中PrintWriter、BufferedWriter以及BufferredReader基本使用詳解

Java中PrintWriter、BufferedWriter以及BufferredReader基本使用詳解

PrintWriter的使用

PrintWriter:是具有自動行重新整理的緩衝字元輸出流,這是一個高階流。所謂的自動行重新整理,意思就是說:在建構函式中指定autoFlush的值為true時,則 println()printf()format() 方法將自動重新整理輸出緩衝區(自動呼叫flush()方法),但是,自動行重新整理無疑會增加寫出次數而降低寫出效率。

建構函式

//使用指定檔案建立不具有自動行重新整理的新 PrintWriter
public PrintWriter(File file);

//建立具有指定檔案和字符集且不帶自動刷行新的新 PrintWriter
public PrintWriter(File file,String csn); //根據現有的 OutputStream 建立不帶自動行重新整理的新 PrintWriter public PrintWriter(OutputStream out); //通過現有的 OutputStream 建立新的 PrintWriter(具有自動行重新整理) public PrintWriter(OutputStream out,boolean autoFlush); //建立具有指定檔名稱且不帶自動行重新整理的新 PrintWriter public PrintWriter(String fileName); //建立具有指定檔名稱和字符集且不帶自動行重新整理的新 PrintWriter
public PrintWriter(String fileName,String csn); //建立新 PrintWriter(具有自動行重新整理) public PrintWriter(Writer out,boolean autoFlush);

從PrintWeiter的構造方法中我們就可以知道,該高階流很靈活,接下來我們會介紹BufferedWriter/BufferedReader這一對字元緩衝流,但是,由於BufferedWriter沒有PrintWriter使用靈活,所以在實際的操作中,我們往往會使用PrinterWriter/BufferedReader這種組合。

常用的方法

//列印boolean值
public void print(boolean b);
//列印 boolean 值,然後終止該行
public void println(boolean x);

//列印字元
public void print(char c);
//列印字元,然後終止該行
public void println(char x);

//列印字元陣列
public void print(char[] s);
//列印字元陣列,然後終止該行
public void println(char[] x);

//列印 double 精度浮點數
public void print(double d);
//列印 double 精度浮點數,然後終止該行
public void println(double x);

//列印一個浮點數
public void print(float f);
//列印浮點數,然後終止該行
public void println(float x);

//列印整數
public void print(int i);
//列印整數,然後終止該行
public void println(int x);

//列印 long 整數
public void print(long l);
//列印 long 整數,然後終止該行
public void println(long x);

//列印物件
public void print(Object obj);
//列印 Object,然後終止該行
public void println(Object x);

//列印字串。如果引數為 null,則列印字串 "null"
public void print(String s);
//列印 String,然後終止該行
public void println(String x);

//通過寫入行分隔符字串終止當前行
public void println();

//使用指定格式字串和引數將一個格式化字串寫入此 writer 中。如果啟用自動重新整理,則呼叫此方法將重新整理輸出緩衝區
public PrintWriter format(Locale l,String format,Object... args);
//使用指定格式字串和引數將一個格式化字串寫入此 writer 中。如果啟用自動重新整理,則呼叫此方法將重新整理輸出緩衝區
public PrintWriter format(String format,Object... args);  

//將指定字元新增到此 writer
public PrintWriter append(char c);
//將指定的字元序列新增到此 writer
public PrintWriter append(CharSequence csq);
//將指定字元序列的子序列新增到此 writer
public PrintWriter append(CharSequence csq,int start,int end);

//寫入字元陣列
public void write(char[] buf);
//寫入字元陣列的某一部分
public void write(char[] buf,int off,int len);
//寫入單個字元
public void write(int c);
//寫入字串
public void write(String s);
//寫入字串的某一部分
public void write(String s,int off,int len);

將字串寫到檔案中

import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
/**
 * PrintWriter:是具有自動行重新整理的緩衝字元輸出流(高階流)
 * @author Administrator
 *
 */
public class PWDemo01 {

    public static void main(String[] args) {
        try {
            //開啟檔案
            FileOutputStream fos=new FileOutputStream("pw.txt");
            //設定編碼集
            OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");

            /**
             * 建立具有自動重新整理的PrinterWriter後,每當我們使用println()/print()
             * 方法寫出字串後,都會自動呼叫flush()方法
             * 但是,這個無疑會增加寫出次數而降低寫出效率
             */
            //寫出資料
            PrintWriter pw=new PrintWriter(osw, true);
            pw.println("字元緩衝");
            pw.append("測試資料");
            pw.write("哈哈哈");
            pw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

BufferedWriter的使用

BufferedWriter:字元緩衝輸出流(高階流),將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。 可以指定緩衝區的大小,或者接受預設的大小。在大多數情況下,預設值就足夠大了。

構造方法

//建立一個使用預設大小輸出緩衝區的緩衝字元輸出流
public BufferedWriter(Writer out);

//建立一個使用給定大小輸出緩衝區的新緩衝字元輸出流
public BufferedWriter(Writer out,int sz);

常用的方法

//寫入字元陣列的某一部分
public void write(char[] cbuf,int off,int len);

//寫入單個字元
public void write(int c);

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

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

將字串寫入到檔案中

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

/**
 * BufferedWriter:字元緩衝輸出流(高階流)
 * @author  作者 E-mail:[email protected]
 * @date 建立時間:2016年10月9日 上午11:10:21
 * @version 1.0
 * @parameter  
 * @since  
 * @return  
 */
public class BWDemo01 {

    public static void main(String[] args) {
        try {
            //開啟檔案
            FileOutputStream fos=new FileOutputStream("pw.txt");
            //設定編碼集
            OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
            //將字元輸出流包裝為字元緩衝輸出流
            BufferedWriter bw=new BufferedWriter(osw);
            bw.write("BW測試文字");
            bw.append("BWBWBWBWBW");
            bw.flush();
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

從BufferedWriter的建構函式和常用的方法中可以看出來,BufferedWriter的使用相比較PrinterWriter來講就比較簡單了,所以在應用中我們一般不使用BufferedWriter而是使用PrinterWriter,大家知道BufferedWriter即可。

BufferedReader的使用

BufferedReader:緩衝字元輸入流,高階流。從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。可以以行為單位讀取字串。

建構函式

//建立一個使用預設大小(8192)輸入緩衝區的緩衝字元輸入流
public BufferedReader(Reader in);

//建立一個使用指定大小輸入緩衝區的緩衝字元輸入流
public BufferedReader(Reader in,int sz);

常用的方法

//讀取單個字元
public int read();

//讀入字元陣列中的某一部分
public int read(char[] cbuf,int off,int len);

//讀取一個文字行
public String readLine();

//跳過字元
public long skip(long n);

從檔案中讀取文字資料

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

/**
 * BufferedReader:緩衝字元輸入流,高階流
 * 從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。
 * 可以以行為單位讀取字串
 * @author Administrator
 *
 */
public class BRDemo01 {
    public static void main(String[] args) {
        try {
            /**
             * 逐個字元的讀取
             */
            FileInputStream fis=new FileInputStream("pw.txt");
            InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
            BufferedReader br=new BufferedReader(isr);
            int size=0;
            while((size=br.read())!=-1){
                char content=(char)size;
                System.out.println(content);
            }

            /**
             * 整行讀取
             */
            FileInputStream fis1=new FileInputStream("pw.txt");
            InputStreamReader isr1=new InputStreamReader(fis1, "UTF-8");
            BufferedReader br1=new BufferedReader(isr1);
            String isNull=null;
            /**
             * public String readLine()
             * 該方法的返回值如果為null,則說明已經讀到檔案的末尾了
             */
            while((isNull=br1.readLine())!=null){
                System.out.println(isNull);
            }
            br.close();
            br1.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

使用PrintWriter/BufferedReader實現檔案的複製

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

public class SummaryPWAndBR {
    public static void main(String[] args) {
        /**
         * 使用字元緩衝輸入流和字元緩衝輸出流實現檔案的複製
         * 1.開啟檔案
         * 2.設定字符集
         * 3.進行讀寫操作
         * 4.關閉流
         */
        try {
            long begin=System.currentTimeMillis();
            //開啟原始檔
            FileInputStream fis=new FileInputStream("pwSrc.txt");
            //設定字符集
            InputStreamReader isr=new InputStreamReader(fis, "UTF-8");
            //從原始檔讀入資料
            BufferedReader br=new BufferedReader(isr);


            //開啟目標檔案
            FileOutputStream fos=new FileOutputStream("pwDest.txt");
            //設定字符集
            OutputStreamWriter osw=new OutputStreamWriter(fos, "UTF-8");
            //寫入資料到目標檔案
            PrintWriter pw=new PrintWriter(osw, true);

            int size=0;
            char[] buffer=new char[10240];
            while((size=br.read(buffer, 0, buffer.length))!=-1){
                pw.write(buffer, 0, size);
            }
            br.close();
            pw.close();
            long end=System.currentTimeMillis();
            System.out.println("使用字元緩衝輸入流實現檔案的複製完畢!耗時:"+(end-begin)+"毫秒");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

執行結果:
執行結果

以上內容只代表我個人的觀點,有什麼錯誤的地方請各路大神指正!轉載請註明出處!謝謝!

每天進步一點點!