鍍金池/ 教程/ Java/ Java Reader/Writer
Java文件屬性
Java FilePermission示例
Java Externalizable實例
Java文件操作
Java文件鎖
Java文件系統(tǒng)
Java異步I/O
Java Reader/Writer
Java File實例
Java FileReader示例
Java控制臺
Java文件所有者權(quán)限
Java通道
Java ByteArrayOutputStream示例
BufferedOutputStream示例
Java FileInputStream示例
Java DataInputStream
Java BufferedInputStream
Java Jar Manifest
Java Console類示例
BufferedWriter示例
Java輸入/輸出教程
Java對象序列化
Java文件教程
Java DataInputStream類型
Java Zip字節(jié)數(shù)組
Java FileWriter示例
FileOutputStream示例
Java PrintStream
Java Scanner類
BufferedInputStream示例
Java字符集
ByteArrayInputStream示例
Java路徑操作
Java DataOutputStream
Java符號鏈接
Java FilterWriter示例
Java Jar API
BufferedReader實例
Java Pipe(管道)
Java jar文件
Java CharArrayReader示例
Java CharArrayWriter示例
Java PushbackInputStream
Java FilterReader示例
Java zip文件
Java InputStream
Java標準輸入/輸出/錯誤流
Java文件內(nèi)容和讀寫
Java FilterInputStream示例
Java內(nèi)存通道
Java路徑
Java令牌和字符串拆分
Java隨機訪問文件
Java文件樹
Java緩沖區(qū)讀寫
Java FileOutputStream
Java目錄事件
Java FilterOutputStream示例
Java DataOutputStream實例
FileDescriptor示例

Java Reader/Writer

Java讀取器和寫入器(Reader/Writer)是基于字符的流。當要從數(shù)據(jù)源讀取基于字符的數(shù)據(jù)時,使用讀取器(Reader)。當想要寫入基于字符的數(shù)據(jù)時使用寫入器(Writer)。

如果有一個流提供字節(jié),想通過將這些字節(jié)解碼為字符讀取字符,應該使用InputStreamReader類。

例如,如果有一個名為isoInputStream對象,并且想要獲取一個Reader對象實例,那么可以這樣做:

Reader  reader = new InputStreamReader(iso);

如果知道在基于字節(jié)的流中使用的編碼,可在創(chuàng)建Reader對象時指定它,如下所示:

Reader  reader = new InputStreamReader(iso,  "US-ASCII");

類似地,可以創(chuàng)建一個Writer對象,從基于字節(jié)的輸出流中輸出的字符,如下所示,假設oso是一個OutputStream對象。以下代碼使從OutputStream使用平臺默認編碼創(chuàng)建Writer對象。

Writer writer  = new OutputStreamWriter(oso);

使用“US-ASCII”編碼從OutputStream創(chuàng)建Writer對象

Writer writer  = new OutputStreamWriter(oso,  "US-ASCII");

示例 -

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class Main {
  public static void main(String[] args) {
    String destFile = "test.txt";

    try (BufferedWriter bw = new BufferedWriter(new FileWriter(destFile))) {
      bw.append("test");
      bw.newLine();
      bw.append("test1");
      bw.newLine();
      bw.append("test2");
      bw.newLine();
      bw.append("test3");

      bw.flush();
    }  catch (Exception e2) {
      e2.printStackTrace();
    }
  }
}

以下代碼從test.txt文件中讀取文本。

import java.io.BufferedReader;
import java.io.FileReader;

public class Main {
  public static void main(String[] args) throws Exception{
    String srcFile = "test.txt";
    BufferedReader br = new BufferedReader(new FileReader(srcFile));
    String text = null;

    while ((text = br.readLine()) != null) {
      System.out.println(text);
    }
    br.close();
  }
}

將基于字節(jié)的流轉(zhuǎn)換為基于字符的流是直接的。如果有一個InputStream對象,可以通過將它包裝在一個InputStreamReader對象中來獲得一個Reader對象,如下所示:

InputStream is = create your  InputStream object here; 
Reader  reader = new InputStreamReader(is);

要從InputStream對象構(gòu)造BufferedReader對象,那么可以這樣做:

InputStream is = create your  InputStream object here; 
BufferedReader br  = new BufferedReader(new InputStreamReader(is));

可以從OutputStream對象構(gòu)造一個Writer對象,如下所示:

OutputStream os  = create your  OutputStream object here; Writer writer  = new OutputStreamWriter(os);

示例

import java.io.FileReader;
import java.io.BufferedReader;
import java.io.Reader;
import java.io.FilterReader;
import java.io.IOException;

class LowerCaseReader extends FilterReader {
    public LowerCaseReader(Reader in) {
        super(in);
    }

    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int count = super.read(cbuf, off, len);
        if (count != -1) {
            // Convert all read characters to lowercase
            int limit = off + count;
            for (int i = off; i < limit; i++) {
                cbuf[i] = Character.toLowerCase(cbuf[i]);
            }
        }
        return count;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        String fileName = "test.txt";
        LowerCaseReader lcr = new LowerCaseReader(new FileReader(fileName));
        int c = -1;
        while ((c = lcr.read()) != -1) {
            System.out.print((char) c);
        }
        lcr.close();
        BufferedReader br = new BufferedReader(new LowerCaseReader(new FileReader(fileName)));
        String str = null;
        while ((str = br.readLine()) != null) {
            System.out.println(str);
        }
        br.close();
    }
}

執(zhí)行上面代碼,得到以下結(jié)果 -

Yiibai.com BufferedInputStream Usge.
The Line 2..yiibai.com bufferedinputstream usge.
the line 2..