1. 程式人生 > >Java IO流-字符流

Java IO流-字符流

out imp 數據 log 類型 buffered demo1 ges 偏移

2017-11-05 18:34:39

Java中的IO流按數據類型分類分為兩種,一是字節流,二是字符流。字符流的出現是為了簡化文本數據的讀入和寫出操作。

如果操作的文件是文本文件,那麽使用字符流會大大簡化操作,但是如果什麽都不知道,就用字節流。

技術分享

  • 字符流

由於字節流中讀取中文不是很方便,所以Java中提供了轉換流,所以

字符流 = 字節流 + 編碼表(By the way,‘a’=97,‘A’=65,‘0’=48)。

字符流也有兩個抽象基類:Writer

            Reader

* OutputStreamWriter

OutputStreamWriter 是字符流通向字節流的橋梁:可使用指定的 charset

將要寫入流中的字符編碼成字節。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。

每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩沖區中累積。可以指定此緩沖區的大小,不過,默認的緩沖區對多數用途來說已足夠大。註意,傳遞給 write() 方法的字符沒有緩沖。

為了獲得最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中,以避免頻繁調用轉換器。

**構造方法

技術分享

**常用方法

技術分享

在寫入String時不指定偏移,則寫入lenth的長度。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter fout = new OutputStreamWriter(new FileOutputStream("" +
                "E:\\text.txt","GBK"));
        fout.write("你好,Java");
     fout.flush(); fout.close(); } }

註意這裏的默認編碼是GBK。正如上文所言,在最後輸出前,會在緩沖區進行編碼,所以需要調用flush清空緩沖區,將文件輸出。但是close()前會自動刷新。

* InputSteamReader

InputStreamReader 是字節流通向字符流的橋梁:它使用指定的 charset 讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。

每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個字節。要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。

為了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。

**構造方法

技術分享

**常用方法

技術分享

為了簡化OutputStreamWriter和InputStreamReader的初始化工作,這兩個類又提供了兩個子類作為便捷類。即:

FileWriter類,初始化方法FileWriter(File file,bool append),註意FileWriter類雖然簡化了構建,但是無法設置編碼方式,需要使用父類OutputStreamWriter

FileReader類,初始化方法FileReader(File file),同樣如果要設定解碼方式,需要使用父類InputStreamReader

==>同樣的,字符流為了高效讀寫也提供了

字符緩沖流:BufferedWriter,BufferedReader。

* BufferedWriter

BufferedWriter將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。

可以指定緩沖區的大小,或者接受默認的大小。在大多數情況下,默認值就足夠大了。

**構造方法

技術分享

**常用方法

技術分享

import java.io.*;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        BufferedWriter fout = new BufferedWriter(new FileWriter(
                "E:\\text.txt"));
        fout.write("你好,Java");
        fout.close();
    }
}

* BufferedReader

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

可以指定緩沖區的大小,或者可使用默認的大小。大多數情況下,默認值就足夠大了。

*構造方法

技術分享

**常用方法

技術分享

readline()終於出來了~ 如果已到達流末尾,則返回 null。

    @Test
    public void demo() throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(
                "E:\\text.txt"));
        int ch;
        while((ch = bufferedReader.read())!=-1)
        {
            System.out.print((char)ch);
        }

        bufferedReader.close();
    }

==>一種特殊的輸出流,打印流PrintWriter。

PrintWriter:向文本輸出流打印對象的格式化表示形式。此類實現在 PrintStream 中的所有 print 方法。它不包含用於寫入原始字節的方法,對於這些字節,程序應該使用未編碼的字節流進行寫入。

PrintStream 類不同,如果啟用了自動刷新,則只有在調用 printlnprintfformat 的其中一個方法時才可能完成此操作,而不是每當正好輸出換行符時才完成。這些方法使用平臺自有的行分隔符概念,而不是換行符。

PrintWriter打印流的特點:

            A:只有寫數據的,沒有讀數據的。

            B:可以操作任意類型的數據

            C:可以指定是否自動刷新

           D:可以直接使用路徑進行初始化

**構造方法

技術分享

**常用方法

技術分享

技術分享

技術分享

Java IO流-字符流