1. 程式人生 > >java 字元流 Reader和Writer

java 字元流 Reader和Writer

位元組流可以處理MP3,圖片,視訊,等用二進位制儲存的資料型別,雖然可以操作強行字元,但會出現各種難以控制的問題

但是不能直接操作Unicode字元,因為一個字元有兩個位元組,位元組流一次只能操作一個位元組。

字元流處理的單元為2個位元組的Unicode字元,字元流用來操作字元、字元陣列或字串

字元流的介紹

輸入字元流Reader繼承圖:

 抽象類Reader的常用方法:

abstract void close() 關閉字元流釋放系統資源
.
int read() 讀一個字元,遊標後移,返回對應的字元對應的unicode編碼,讀不到內容返回-1
int read(char[] cbuf) 將內容放入char陣列,存放的是字元對應的unicode編碼,返回存放字元的個數,讀不到內容返回-1

abstract int read(char[] cbuf, int off, int len)讀取指定長度的存放到char陣列,存放字元對應的unicode編碼,讀不到內容返回-1

以Reader的子類FileReader來演示:

package IoCharctorTest01;

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


public class IoCharTest01 {
    public static void main(String[] args){
        try (
                FileReader r=new FileReader("test\\test0.txt");
                ){
            /*
            int temp;
            while ((temp=r.read())!=-1){
                System.out.println( (char)temp);
            }
            */

            char [] chars=new char[3];
            int temp;
            while ((temp=r.read(chars))!=-1){
                System.out.println(new String(chars,0,temp) );
            }
            



        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

輸出字元流Writer

Writer的繼承關係圖

Writer抽象類的常用方法:
abstract void close(),重新整理字元輸出流,再關閉它
abstract void flush() 重新整理流,保證寫入成功
void write(char[] cbuf) 寫一個char型別的陣列
abstract void write(char[] cbuf, int off, int len)寫char陣列,根據指定索引和長度
void write(int c)寫一個字元,這個字元是int型的unicode編碼
void write(String str)寫一個字串
void write(String str, int off, int len)寫字串,根據指定索引和長度
以FileWriter類示例

FileWriter的常用構造方法:

FileWriter(File file)根據給定檔案構造FileWriter物件
FileWriter(File file, boolean append)根據給定檔案構造FileWriter物件,第2個引數選擇是否覆蓋原有檔案內容
FileWriter(String fileName)根據給定字串路徑構造FileWriter物件
FileWriter(String fileName, boolean append)根據給定字串路徑構造FileWriter物件,第2個引數選擇是否覆蓋原有檔案內容
注意:如果路徑不存在,則會在該路徑下建立檔案

package IoCharctorTest01;

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


public class IoTest02 {
    public static void main(String[] args){
        try (
                FileWriter fw=new FileWriter("test\\test4.txt");
                ){
            fw.write("你好,中國,我們要加油!");
            fw.write(95);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
out:
test4.txt中的內容如下:
你好,中國,我們要加油!_

應用字元流可以解決字元的亂碼問題

用字元流拷貝文字檔案可以避免檔案中的內容亂碼,需要注意的是字元流不能拷貝非文字檔案,比如word文件,照片,視訊等檔案,會出現錯誤.

示例:

import java.io.*;

public class fileCopy01 {
    public static void main(String[] args){
        try (
                FileReader fr=new FileReader("word.txt") ;
                FileWriter fw=new FileWriter("word1.txt");
                ){
            //通過char陣列,複製檔案
            char[] chars=new char[5];
            int temp;
            while ((temp=fr.read(chars))!=-1){
                fw.write(chars,0,temp);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
out:
原始檔內容:
好嗎
天天
目標檔案內容:
好嗎
天天