1. 程式人生 > >20、java.io.Reader字元輸入流

20、java.io.Reader字元輸入流

一、Reader

  1. 用於讀取字元流的抽象類。
  2. 子類必須實現的方法只有 read(char[], int, int) 和 close()。
  3. 但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能
  4. 直接已知子類: 
  5. BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader 
public abstract class Reader implements Readable, Closeable
{
	/**
	 *讀取單個字元。在字元可用、發生 I/O 錯誤或者已到達流的末尾前,此方法一直阻塞。
	 *作為整數讀取的字元,範圍在 0 到 65535 之間 (0x00-0xffff),如果已到達流的末尾,則返回 -1
	 */
	public int read()
         throws IOException{}

	//將字元讀入陣列。在某個輸入可用、發生 I/O 錯誤或者已到達流的末尾前,此方法一直阻塞
	public int read(char[] cbuf)
         throws IOException{}

	//將字元讀入陣列的某一部分。在某個輸入可用、發生 I/O 錯誤或者到達流的末尾前,此方法一直阻塞
	public abstract int read(char[] cbuf,
                         int off,
                         int len)
                  throws IOException;

	//跳過字元。在某個字元可用、發生 I/O 錯誤或者已到達流的末尾前,此方法一直阻塞
	public long skip(long n)
          throws IOException{}

	/**
	 *關閉該流並釋放與之關聯的所有資源。
	 *在關閉該流後,再呼叫 read()、ready()、mark()、reset() 或 skip() 將丟擲 IOException。
	 *關閉以前關閉的流無效。
	 */
	public abstract void close()
                    throws IOException;
}

二、InputStreamReader

  1. InputStreamReader 是位元組流通向字元流的橋樑:
  2. 它使用指定的 charset 讀取位元組並將其解碼為字元。
  3. 它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺預設的字符集。 
  4. 每次呼叫 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個位元組。
  5. 要啟用從位元組到字元的有效轉換,可以提前從底層流讀取更多的位元組,使其超過滿足當前讀取操作所需的位元組。
  6. 為了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader
public class InputStreamReader extends Reader
{
	//建立一個使用預設字符集的 InputStreamReader
	public InputStreamReader(InputStream in){}

	//建立使用指定字符集的 InputStreamReader
	public InputStreamReader(InputStream in,
                         String charsetName)
                  throws UnsupportedEncodingException{}

	//返回此流使用的字元編碼的名稱。
	public String getEncoding(){}

	//其餘方法均繼承自Reader和Object
}

三、FileReader

  1. 用來讀取字元檔案的便捷類。
  2. 此類的構造方法假定預設字元編碼和預設位元組緩衝區大小都是適當的。
  3. 要自己指定這些值,可以先在 FileInputStream 上構造一個 InputStreamReader。 
  4. FileReader 用於讀取字元流。要讀取原始位元組流,請考慮使用 FileInputStream。
public class FileReader extends InputStreamReader
{
	//在給定從中讀取資料的 File 的情況下建立一個新 FileReader
	public FileReader(File file)
           throws FileNotFoundException{}

	//在給定從中讀取資料的檔名的情況下建立一個新 FileReader。
	public FileReader(String fileName)
           throws FileNotFoundException{}

	//其餘方法均繼承自InputStreamReader
}

 示例:

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

/**
 * 需求:複製檔案
 */
public class ReaderTest {

	public static void main(String[] args) {
		String resName = "E:/f/code/a.java";
		String desName = "E:/a.java";
		copy(resName,desName);
	}
	public static void copy(String resName,String desName)
	{
		FileReader fr = null;
		FileWriter fw = null;
		try {
			fr = new FileReader(resName);
			fw = new FileWriter(desName);
			char[] buf = new char[1024];
			int num = 0;
			while((num=fr.read(buf))!=-1)
			{
				fw.write(buf);
				fw.flush();
			}
			System.out.println("複製成功");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			if(fr != null)
			{
				try {
					fr.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(fw != null)
			{
				try {
					fw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}