Java I/O框架——字符流

內容先覽

  • 1字符編碼
  • 2字符流
    • 2.1字符流的父類
      • 2.1.1Reader
      • 2.1.2Writer
    • 2.2字符字節流
      • 2.2.1FileWriter
      • 2.2.2FileReader
    • 2.3字符過濾流
      • 2.3.1 BufferedWriter
      • 2.3.2 PrintWriter
      • 2.3.3 BufferedReader
  • 3.字符節點流
    • 3.1橋轉換流
      • 3.1.1InputStreamReader
      • 3.1.2OutputStreamWriter
    • 3.2使用步驟

1字符編碼

  • IOS-8859-1 收錄除ASCII外,還包括西歐、希臘語、泰語、阿拉伯、希伯來語對應的文字符號
  • UTF-8 針對Unicode的可變長度字符編碼 常用
  • GB2312 簡體中文
  • GBK簡體中文、擴充
  • BIG5 臺灣,繁體中文
  • 編碼和解碼不一致時會導致
public class TestEncoding {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String str = "你好世界123abc";
		//byte[] bs = str.getBytes();
		//for (int i = 0; i < bs.length; i++) {
		//	System.out.println((char)bs[i]);
		//}
		// 解碼 二進制=>文本
		//String str2 = new String(bs);
		byte[] bs = str.getBytes("GBK");
		String str2 = new String(bs,"BIG5");
		byte[] bs2 = str2.getBytes("BIG5");
		String str3 = new String(bs2,"GBK");
		System.out.println(str3);
		
		String s1 = "你好陶喆abc123";
		// 編碼 字符集是一致的
		byte[] b = s1.getBytes("UTF-8");
		// 解碼 字符集是一致的
		String s2 = new String(b,"UTF-8");
		System.out.println(s2);
		
	}
}

2字符流

2.1字符流的父類
2.1.1Reader
  • 讀取字符流的抽象類。這一類必須實現的唯一方法是讀(char [],int,int)和()。大多數子類,但是,將重寫這裏定義的一些方法,以提供更高的效率,額外的功能,或兩者都有。
  • 構造方法
  • 是字符流的頂級父類
    在這裏插入圖片描述
  • 常用方法
abstract void close() 
關閉流並釋放與它相關聯的任何系統資源。  
void mark(int readAheadLimit) 
標記流中的當前位置。  
boolean markSupported() 
告訴這是否流支持的mark()操作。  
int read() 
讀取單個字符。  
int read(char[] cbuf) 
將字符讀入一個數組。  
abstract int read(char[] cbuf, int off, int len) 
將字符讀入一個數組的一部分。  
int read(CharBuffer target) 
試圖將字符讀入指定的字符緩衝區中。  
boolean ready() 
告訴是否該流已準備好閱讀。  
void reset() 
重置流。  
long skip(long n) 
跳過的字符。  

2.1.2Writer
  • 是字符流的頂級父類
  • 用於寫入到字符流的抽象類。這一類必須實現的唯一方法是寫(char [],int,int),flush(),和()。大多數子類,但是,將重寫這裏定義的一些方法,以提供更高的效率,額外的功能,或兩者都有。
  • 構造方法
    在這裏插入圖片描述
  • 普通方法
Writer append(char c) 
將指定的字符到這個作家。  
Writer append(CharSequence csq) 
將指定的字符序列,這個作家。  
Writer append(CharSequence csq, int start, int end) 
添加一個序列指定的字符序列,這個作家。  
abstract void close() 
關閉流,沖洗它。  
abstract void flush() 
沖流。  
void write(char[] cbuf) 
寫一個字符數組。  
abstract void write(char[] cbuf, int off, int len) 
寫入一個字符數組的一部分。  
void write(int c) 
寫一個字符。  
void write(String str) 
寫一個字符串。  
void write(String str, int off, int len) 
寫入字符串的一部分。  
2.2 字符節點流
2.2.1FileWriter
  • 用於寫入字符文件的方便類。該類的構造函數假定默認字符編碼和默認字節緩衝區大小是可以接受的
  • 是Writer的實現子類
  • 構造方法
    在這裏插入圖片描述
  • 普通方法(常用)
public void write(String str) 
// 一次寫多個字符,寫入輸出流
2.2.2FileReader
  • 是InputStreamReader的實現子類
  • 是Reader的孫子類
  • 構造方法
    在這裏插入圖片描述
  • 普通方法(常用)
public int read(char[] c) 
//從流中讀取多個字符,將讀到內存存入c數組,
//返回實際獨到的字符數;如果達到文件的尾部,則返回-1
  • FileReader與FileWriter 示例
public class TestWriter {
	public static void main(String[] args) throws Exception{
		FileWriter fWriter = new FileWriter("./src/txt/target.txt");
		
		fWriter.write("Hello今天天氣好\n\r");
		fWriter.write("Hello今天天氣好");
		char[] chars = new char[] {'你','好','嘛'};
		//fWriter.append("Hello今天天氣好");
		fWriter.write(chars);
		fWriter.flush();
		fWriter.close();
		
		FileReader fileReader = new FileReader("./src/txt/target.txt");
		char[] cache = new char[5];
		int n;
		while ((n = fileReader.read(cache))!=-1) {
			for (int i = 0; i < n; i++) {
				System.out.print(cache[i]);
			}
			System.out.println("");
		}
		
	}
}
2.3字符過濾流
2.3.1BufferedWriter
  • 支持換行符
  • newLine()方法換行 可一次寫一行、讀一行
  • 構造方法
    在這裏插入圖片描述
  • 普通方法
void close() 
關閉流並釋放與它相關聯的任何系統資源。  
Stream<String> lines() 
返回一個 Stream,其中的元素是線從這 BufferedReader讀。  
void mark(int readAheadLimit) 
標記流中的當前位置。  
boolean markSupported() 
告訴這是否流支持的mark()操作,它。  
int read() 
讀取單個字符。  
int read(char[] cbuf, int off, int len) 
將字符讀入一個數組的一部分。  
String readLine() 
讀一行文本。  
boolean ready() 
告訴是否該流已準備好閱讀。  
void reset() 
將流到最近的標記。  
long skip(long n) 
跳過的字符。  
2.3.2 PrintWriter
  • 跟BufferedWriter類似但是比BufferedWriter使用更廣泛因爲其就有pringln()方法取代了BufferedWriter麻煩的nextLine()方法
  • Writer類的直接實現類(子類)
  • 構造函數
    在這裏插入圖片描述
  • 普通方法
PrintWriter append(char c) 
將指定的字符到這個作家。  
PrintWriter append(CharSequence csq) 
將指定的字符序列,這個作家。  
PrintWriter append(CharSequence csq, int start, int end) 
添加一個序列指定的字符序列,這個作家。  
boolean checkError() 
刷新流如果不是封閉的,檢查它的錯誤狀態。  
protected void clearError() 
清除此流的錯誤狀態。  
void close() 
關閉流並釋放與它相關聯的任何系統資源。  
void flush() 
沖流。  
PrintWriter format(Locale l, String format, Object... args) 
使用指定的格式字符串和參數將格式化的字符串寫入到這個寫作者。  
PrintWriter format(String format, Object... args) 
使用指定的格式字符串和參數將格式化的字符串寫入到這個寫作者。  
void print(boolean b) 
打印布爾值。  
void print(char c) 
打印一個字符。  
void print(char[] s) 
打印一個字符數組。  
void print(double d) 
打印一個雙精度浮點數。  
void print(float f) 
打印一個浮點數。  
void print(int i) 
打印一個整數。  
void print(long l) 
打印一個長整數。  
void print(Object obj) 
打印一個對象。  
void print(String s) 
打印一個字符串。  
PrintWriter printf(Locale l, String format, Object... args) 
使用指定的格式字符串和參數編寫格式化字符串的方便方法。  
PrintWriter printf(String format, Object... args) 
使用指定的格式字符串和參數編寫格式化字符串的方便方法。  
void println() 
通過編寫行分隔符終止當前行。  
void println(boolean x) 
打印一個布爾值,然後終止該行。  
void println(char x) 
打印一個字符,然後終止行。  
void println(char[] x) 
打印一個字符數組,然後終止行。  
void println(double x) 
打印一個雙精度浮點數,然後終止行。  
void println(float x) 
打印一個浮點數,然後終止該行。  
void println(int x) 
打印一個整數,然後終止行。  
void println(long x) 
打印一個長整數,然後終止行。  
void println(Object x) 
打印一個對象,然後終止該行。  
void println(String x) 
打印一個字符串,然後終止行。  
protected void setError() 
指示發生了一個錯誤。  
void write(char[] buf) 
寫一個字符數組。  
void write(char[] buf, int off, int len) 
寫入一個字符數組的一部分。  
void write(int c) 
寫一個字符。  
void write(String s) 
寫一個字符串。  
void write(String s, int off, int len) 
寫入字符串的一部分。  

2.3.3BufferedReader
  • 能夠讀取一行
  • 構造函數
    在這裏插入圖片描述
  • 普通方法
void close() 
關閉流並釋放與它相關聯的任何系統資源。  
Stream<String> lines() 
返回一個 Stream,其中的元素是線從這 BufferedReader讀。  
void mark(int readAheadLimit) 
標記流中的當前位置。  
boolean markSupported() 
告訴這是否流支持的mark()操作,它。  
int read() 
讀取單個字符。  
int read(char[] cbuf, int off, int len) 
將字符讀入一個數組的一部分。  
String readLine() 
讀一行文本。  
boolean ready() 
告訴是否該流已準備好閱讀。  
void reset() 
將流到最近的標記。  
long skip(long n) 
跳過的字符。  

BufferedReader、PrintWriter、BufferedWriter 綜合示例
public class TestConverStream1 {
	public static void main(String[] args) throws Exception{
		//1.字節輸出流
		OutputStream ops = new FileOutputStream("./src/txt/target.txt"); 
		//2.轉換爲字符輸出流
		OutputStreamWriter osw= new OutputStreamWriter(ops,"UTF-8");
		//3.包裝字符過濾流
		PrintWriter pWriter = new PrintWriter(osw); 
		
		// BufferedWriter ps = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("./src/txt/target.txt"),"UTF-8"));	
		// ps.write("你好世界\r\n");
		// ps.write("你好世界");
		pWriter.println("你好世界");
		pWriter.close();
		
		//2.字節輸入流
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./src/txt/target.txt"),"UTF-8"));
		String n;
		while ((n = br.readLine())!=null) {
			System.out.println(n);
		}
		
	}
}

3.字符節點流

3.1橋轉換流
  • 將字節流包裝轉換成字符流
  • 在轉換期間可以轉換改變編碼
3.1.1 InputStreamReader
  • Reader直接子類(實現類)
  • 構造方法
    在這裏插入圖片描述
  • 普通方法
void close() 
關閉流並釋放與它相關聯的任何系統資源。  
String getEncoding() 
返回此流使用的字符編碼的名稱。  
int read() 
讀取單個字符。  
int read(char[] cbuf, int offset, int length) 
將字符讀入一個數組的一部分。  
boolean ready() 
告訴是否該流已準備好閱讀。  

3.1.2 OutputStreamWriter
  • Writer直接實現類(子類)
  • 構造方法
    在這裏插入圖片描述
  • 普通方法
void close() 
關閉流,沖洗它。  
void flush() 
沖流。  
String getEncoding() 
返回此流使用的字符編碼的名稱。  
void write(char[] cbuf, int off, int len) 
寫入一個字符數組的一部分。  
void write(int c) 
寫一個字符。  
void write(String str, int off, int len) 
寫入字符串的一部分。  

3.2使用步驟
  • 創建節點流
  • 創建過濾流,設置字符編碼集
  • 封裝字符過濾流
  • 讀寫數據
  • 關閉流
    [注意:讀取同一個文件時候編碼要設置一致]
InputStreamReader、 OutputStreamWriter 綜合示例
public class Test {
	public static void main(String[] args) throws Exception{
		//1.字節輸出流
		OutputStream ops = new FileOutputStream("./src/txt/target.txt"); 
		//2.轉換爲字符輸出流
		OutputStreamWriter osw= new OutputStreamWriter(ops,"UTF-8");
		//3.包裝字符過濾流
		PrintWriter pWriter = new PrintWriter(osw); 
		// 也可以寫成一句
		// PrintWriter ps = new PrintWriter(new OutputStreamWriter(new FileOutputStream("./src/txt/char.txt"),"UTF-8"));
		pWriter.println("你好世界");
		pWriter.close();
		
		//2.字節輸入流
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("./src/txt/target.txt"),"UTF-8"));
		String n;
		while ((n = br.readLine())!=null) {
			System.out.println(n);
		}
		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章