1. 程式人生 > >OutputStreamWriter和InputStreamReader以及Writer和Reader和PrintWriter

OutputStreamWriter和InputStreamReader以及Writer和Reader和PrintWriter

一、Reader是字元輸入流的父類。Writer是字元輸出流的父類。
字元流是以(char)為單位讀寫資料的。一次處理一個unicode.
字元流的底層仍然是基本的位元組流。
InputStreamReader:字元輸入流。使用該流可以設定字符集,並安裝指定的字符集從流中按照該編碼將位元組資料轉換為字元並讀取。
OutputStreamWriter:字元輸出流。使用該流可以設定字符集,並安裝指定的字符集將字元轉換為對應位元組後通過該流寫出。
例1:通過OutputStreamReader寫檔案:

package day02;
import java.io.FileOutputStream;
import
java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; /** * OutputStreamWriter 字元輸出流,可以將給定的字串轉換為對應的位元組然後寫出。 * 字元流都是高階流 */ public class OSWDemo { public static void main(String[] args) throws UnsupportedEncodingException, IOException { /* * 向檔案中寫出一個字串 */
FileOutputStream fos= new FileOutputStream("osw.txt"); /* * 使用OSW可以按照指定的字符集方便的寫出字串。 */ OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8"); osw.write("挖掘機技術哪家強?"); osw.write("摩擦摩擦是魔鬼的步伐!"); osw.close(); } }

使用InputStreamReader讀取剛才寫的句子:

package day02;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
 * InputStreamReader 字元輸入流,可以根據指定的字符集讀取字元
 */
public class ISRDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis= new FileInputStream("osw.txt");
        /*
         * 使用該高階流,可以按照給定的字符集讀取對應的字元,第二個引數若不指定,就是按照當前系統預設字符集。
         */
        InputStreamReader isr= new InputStreamReader(fis,"UTF-8");
        /*
         * 由於一個字元一個字元讀取會提高讀取的次數,這樣會降低讀取的效率。
         */
//      int d = -1;
//      while((d = isr.read())!=-1){
//          System.out.print((char)d);
//      }
        char[] data = new char[1024];//字元流是以(char)為單位讀寫資料的
        /*
         * 與批量讀取位元組意思一致。一次嘗試讀取data長度的字元量,返回值為實際讀取到的字元量。若返回值-1表示EOF。
         */
        int len = isr.read(data);
        String str = new String(data,0,len);
        System.out.println(str);
        isr.close();
    }
}

二、PrintWriter
java.io.PrintWriter:緩衝字元輸出流;特點:允許以行單位寫出字串。提供了很多方便的構造方法,允許我們快速建立該流。
例1:

package day02;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
/**
 * java.io.PrintWriter:緩衝字元輸出流
 * 特點:允許以行單位寫出字串。提供了很多方便的構造方法,允許我們快速建立該流
  */
public class PWDemo {
    public static void main(String[] args) throws IOException {
        /*
         * 支援兩個直接向檔案中寫入資料的構造
         * 方法
         * PrintWriter(File file)
         * PrintWriter(String filepath)
         * 
         * 看似是可以直接向檔案中寫入,但事實上
         * 其構造方法中會建立FOS向檔案中寫。
         * 只是我們不用層層巢狀來組裝不同的高階流
         * 而已。
         * 
         * 若希望按照指定的字符集寫出字串到檔案中
         * 那麼
         * PrintWriter(File f)
         * PrintWriter(String filepath)
         * 以上兩個構造方法都支援一個過載,過載的
         * 構造方法可以傳入第二個引數,來指定字符集。
         */
        PrintWriter pw = new PrintWriter("pw.txt","UTF-8");
        pw.println("摩擦摩擦,是魔鬼的步伐!");
        pw.println("哎呦我去滑板鞋!");
        System.out.println();
        pw.close();
    }
}

例2:

package day02;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
/**
 * PrintWriter處理其他流
 */
public class PWDemo2 {
    public static void main(String[] args) throws IOException {
        /*
         * PrintWriter(OutputStream out):可以處理給定的位元組輸出流,變為一個緩衝字元輸出流
         * PrintWriter(Writer out):可以處理給定的字元輸出流,變為一個緩衝字元輸出流
         */
        FileOutputStream fos= new FileOutputStream("pw2.txt");
        //若希望按照指定字符集寫出,建立該字元流做轉換
        OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8");
        PrintWriter pw= new PrintWriter(osw);
        pw.println("啦啦啦啦");
        pw.close();
    }
}

例3:

package day02;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
/**
 * PrintWriter的特點:具有自動行重新整理功能當我們使用PrintWriter去處理一個流的時候,可以將PrintWriter宣告為具有自動行重新整理功能。
 */
public class PWDemo3 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos= new FileOutputStream("pw3.txt");
        OutputStreamWriter osw= new OutputStreamWriter(fos,"UTF-8");
        /*
         * 當呼叫的構造方法第一個引數為流時,那麼支援傳入第二個引數,該引數為boolean型別;若值為true,那麼當前PrintWriter就具有了自動行重新整理功能。
         */
        PrintWriter pw= new PrintWriter(osw,true);
        /*
         * 當具有了自動行重新整理功能的PW在呼叫println方法寫出字串的時候會自動呼叫flush強制寫出。
         */
        pw.println("你好!");
        pw.println("再見!");
        pw.close();
    }
}