1. 程式人生 > 實用技巧 >23_IO流之字元流

23_IO流之字元流

1 字元流處理編碼問題

用來處理中文等位元組流不好處理的的情況.

InputStreamReader

OutputStreamWriter

package f_readerWriter;

import java.io.*;

/**
 * 字元流
 */
public class ReaderWriter01 {
    public static void main(String[] args) throws IOException {
        //預設編碼
        //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("9_io\\dest.txt"));

        //指定編碼
        //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("9_io\\dest.txt"),"UTF-8");
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("9_io\\dest.txt"),"GBK");

        osw.write("中國");
        osw.close();


        //輸入流
        //  InputStreamReader isr = new InputStreamReader(new FileInputStream("9_io\\dest.txt"));
        InputStreamReader isr = new InputStreamReader(new FileInputStream("9_io\\dest.txt"),"GBK");

        //一次一個字元
        int ch;
        while((ch=isr.read()) != -1){
            System.out.print((char)ch);
        }


        isr.close();
    }
}

2 字元流寫資料的5種方式(記得重新整理)

方法名 說明
void write(int c) 寫一個字元
void write(char[] cbuf) 寫一個字元陣列
void write(char[] cbuf, int off, int len) 寫一個字元陣列的一部分
void write(String str) 寫一個字串
void write(String str, int off, int len) 寫一個字串的一部分
package f_readerWriter;

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

/**
 * 寫資料五種方法
 */
public class ReaderWriter02  {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("9_io\\dest.txt"),"UTF-8");

        // void write(int c) | 寫一個字元
        //osw.write(97);
        //osw.write(98);
        //osw.flush();//重新整理流

        //void write(char[] cbuf) | 寫一個字元陣列
        char[] chs = {'a', 'b', 'c', 'd', 'e'};
        //osw.write(chs);

        //void write(char[] cbuf, int off, int len) | 寫一個字元陣列的一部分
        //osw.write(chs, 0, chs.length);
        //osw.write(chs, 1, 3);

        //void write(String str) | 寫一個字串
        //osw.write("abcde");

        //void write(String str, int off, int len) | 寫一個字串的一部分
        //osw.write("abcde", 0, "abcde".length());
        osw.write("abcde", 1, 3);

        //釋放資源
        osw.close();
    }
}

3 字元流讀資料的2種方式

方法名 說明
int read() 一次讀一個字元資料
int read(char[] cbuf) 一次讀一個字元陣列資料
package f_readerWriter;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 讀資料的2種方式
 */
public class ReaderWriter03 {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("9_io\\src.txt"));
        //int read() | 一次讀一個字元資料
        //int ch;
        //while((ch=isr.read()) != -1){
        //    System.out.print((char)ch);
        //}

        // int read(char[] cbuf) | 一次讀一個字元陣列資料
        char[] chs = new char[1024];
        int len;
        while((len=isr.read(chs)) != -1){
            System.out.print(new String(chs, 0, len));
        }

        isr.close();
    }
}

4 轉換流

  1. FileReader: FileReader(String fileName);
  2. FileWriter: FileWriter(String fileName);
package f_readerWriter;

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

/**
 * 轉換流
 */
public class ReaderWriter04 {
    public static void main(String[] args) throws IOException {
        //建立輸入流
        FileReader fr = new FileReader("9_io\\src.txt");
        //建立輸出流
        FileWriter fw = new FileWriter("9_io\\dest.txt");

        //複製檔案
        //int ch;
        //while((ch=fr.read()) != -1){
        //    fw.write(ch);
        //}

        char[] chs = new char[1024];
        int len;
        while((len=fr.read(chs)) != -1){
            fw.write(chs, 0, len);
        }

        //釋放資源
        fr.close();
        fw.close();
    }
}