1. 程式人生 > >java-io流-字元流

java-io流-字元流

選擇了安逸,就選擇了平庸 -2018.10.30

字元流

字元流用於處理用ASCII字符集或Unicode(包含ASCII的國際字符集)表示的文字,可以用字元流來處理的檔案有純文字檔案,HTML文件,和java原始碼檔案。用於讀寫這些流的類都是Reader和Writer的子類,對於所有的文字輸入,都應使用字元流來處理,而不能直接使用位元組流來處理。

字元的繼承關係

字元繼承關係圖

讀寫檔案

FileReader是InputStreamReader的子類,常用於從檔案中讀取字元流。FileWriter為OutputStreamWriter的子類,常用於向檔案中寫字元流。

檔案中讀寫

構造方法

public FileReader(File file)  
public FileReader(String fileName) 

public FileWriter(File file) 
       根據給定的 File 物件構造一個 FileWriter 物件。 
public FileWriter(File file, boolean append) 
       根據給定的 File 物件構造一個 FileWriter 物件,append代表是否為追加。
public FileWriter(String fileName) 
       根據給定的檔名構造一個 FileWriter 物件。 
public FileWriter(String fileName, boolean append) 
       根據給定的檔名以及指示是否附加寫入資料的 boolean 值來構造 FileWriter 物件。

1、在給定指定檔名或者指定的檔案的情況下讀寫資料
2、FileNotFoundException -如果檔案不存在,或者它是一個目錄,而不是一個常規檔案,抑或因為其他某些原因而無法開啟進行讀取
3、IOException - 如果該檔案存在,但它是一個目錄,而不是一個常規檔案;或者該檔案不存在,但無法建立它;抑或因為其他某些原因而無法開啟它

 private static Reader testReader = null;
    private static Writer testWriter = null;
    private static String readFilePath = "C:/Users/asus-pc/Desktop/javaProject/src/testIoChar/IoCharDemo.java";
	private static String writeFilePath = "C:/Users/asus-pc/Desktop/javaProject/src/testIoChar/IoCharDemo2.java";
    public static void main(String[] args) throws IOException {
		  File  file  = new File(readFilePath);
	       testReader = new FileReader(file);
          //testReade = new FileReader(filePath);
	       //兩種構造方法都可以
	       testWriter = new FileWriter(writeFilePath);//重寫檔案
	       //testWriter = new FileWriter(writeFilePath,true);在檔案尾追加資料
	       }

常用方法概述

從類 java.io.InputStreamReader 繼承的方法 
close, getEncoding, read, read, ready 
  從類 java.io.Reader 繼承的方法 
mark, markSupported, read, read, reset, skip 

常用方法與位元組操作相同

package testIoChar;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;

public class IoCharDemo {
    private static Reader testReader = null;
    private static Writer testWriter = null;
    private static String readFilePath = "C:/Users/asus-pc/Desktop/javaProject/src/testIoChar/IoCharDemo.java";
	private static String writeFilePath = "C:/Users/asus-pc/Desktop/javaProject/src/testIoChar/IoCharDemo2.java";
    public static void main(String[] args) throws IOException {
		  File  file  = new File(readFilePath);
	       testReader = new FileReader(file);
          //testReade = new FileReader(filePath);
	       //兩種構造方法都可以
	       testWriter = new FileWriter(writeFilePath);
	       char[]ch = new char[(int)file.length()];
	       testReader.read(ch);
	       System.out.println(new String(ch));
	       testWriter.write(new String(ch));
	       testReader.close();
	       testWriter.close();
	       //如果沒有關閉,會發現檔案中沒有資料,因為沒有重新整理流,資料只是寫在了流裡
	       //close()方法中呼叫了flush()。
    }
}

轉換流(InputStreamReader,OutputWriter)

InputStreamReader

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

方法概述

InputStreamReader(InputStream in) 
          建立一個使用預設字符集的 InputStreamReader。 
InputStreamReader(InputStream in, Charset cs) 
          建立使用給定字符集的 InputStreamReader。 
InputStreamReader(InputStream in, CharsetDecoder dec) 
          建立使用給定字符集解碼器的 InputStreamReader。 
InputStreamReader(InputStream in, String charsetName) 
          建立使用指定字符集的 InputStreamReader。 
          charset的常見編碼
          US-ASCII 7 位 ASCII 字元,也叫作 ISO646-US、Unicode 字符集的基本拉丁塊 
		 ISO-8859-1   ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 
		UTF-8 8 位 UCS 轉換格式 
		UTF-16BE 16 位 UCS 轉換格式,Big Endian(最低地址存放高位位元組)位元組順序 
		UTF-16LE 16 位 UCS 轉換格式,Little-endian(最高地址存放低位位元組)位元組順序 
		UTF-16 16 位 UCS 轉換格式,位元組順序由可選的位元組順序標記來標識 
          
普通方法概述
void close() 
          關閉該流並釋放與之關聯的所有資源。 
 String getEncoding() 
          返回此流使用的字元編碼的名稱。 
 int read() 
          讀取單個字元。 
 int read(char[] cbuf, int offset, int length) 
          將字元讀入陣列中的某一部分。 
 boolean ready() 
          判斷此流是否已經準備好用於讀取。 

示例
將一個用UTF-8編碼的文字檔案用位元組流讀進來,觀察之後,再用字元流轉換該位元組流,觀察結果。(新建一個文字文件,命名為test.txt,另存為時,選擇UTF-8格式儲存。)

package IODemo;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class InputStreamReaderDemo {
   private static String FilePath ="C:/Users/asus-pc/Desktop/javaProject/Demo/src/IODemo/test.txt";
	private static InputStream iStream =null;
	public static void main(String[] args) {
	 	try {
	 		byte bytes[] =new byte[1024];
			iStream =new FileInputStream(FilePath);
			int data =-1;
		  iStream.read(bytes);
		  System.out.println(new String(bytes));
			
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
}

執行結果(可以看出是亂碼)

鍩胯繖鏄竴涓祴璇曟枃浠躲??

用轉換流進行轉換讀寫

package IODemo;

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

public class InputStreamReaderDemo {
   private static String FilePath ="C:/Users/asus-pc/Desktop/javaProject/Demo/src/IODemo/test.txt";
	private static InputStream iStream =null;
	private static InputStreamReader iReader =null;
	public static void main(String[] args) {
	 	try {
	 		char ch[] =new char[1024];
			iStream =new FileInputStream(FilePath);
			iReader =new InputStreamReader(iStream,"UTF-8");
			BufferedReader bufferedReader =new BufferedReader(iReader);
			//此處可以新增緩衝流,也可以不新增
		  String data =null;
			while((data=bufferedReader.readLine())!=null)
			 System.out.println(data);
		} catch (IOException e) {
			e.printStackTrace();
		}
	
	}
}

執行結果

?這是一個測試檔案

前面之所以多出一個?,是因為儲存為txt檔案時,有個位元組順序標記,出現在文字檔案頭部,Unicode編碼標準中用於標識檔案是採用哪種格式的編碼。