【JavaSE筆記】IO(四)字符流

本期知識點:

字符流

1.概述

字節流操作中文數據不是特別的方便,所以就出現了轉換流。轉換流的作用就是把字節流轉換字符流來使用。

2.轉換流其實是一個字符流

字符流 = 字節流 + 編碼表
編碼表
a.就是由字符和對應的數值組成的一張表
b.常見的編碼表
ASCII
ISO-8859-1
GB2312
GBK
GB18030
UTF-8
c.字符串中的編碼問題
編碼
String -- byte[]
解碼
byte[] -- String

3.引出:

字節流一次讀取一個字節數組有問題:出現中文亂碼
那麼利用字符流進行操作

4.回顧String類的方法:

public byte[] getBytes(Charset charset)throws UnsupportedEncodingException   將String類型轉換成字節數組:編碼

public String(byte[] bytes,String charsetName)   將byle類型的數組轉換成String類型:解碼

5.IO流中的編碼問題

a.OutputStreamWriter
OutputStreamWriter(OutputStream os):默認編碼,GBK
OutputStreamWriter(OutputStream os,String charsetName):指定編碼。
b.InputStreamReader
InputStreamReader(InputStream is):默認編碼,GBK
InputStreamReader(InputStream is,String charsetName):指定編碼
c.編碼問題其實很簡單
編碼只要一致即可

6.字符流體系:

字符流
Reader
|--InputStreamReader
|--FileReader
|--BufferedReader
Writer
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter

7.字符輸入流:

a.概述:

讀數據: Reader:抽象類------->InputStreamReader--->FileReader
public InputStreamReader(InputStream in):默認的編碼格式
public InputStreamReader(InputStream in,String charsetName):指定的編碼格式
字符輸入流(轉換流) = 字節輸入流 + 編碼表

b.字符輸入流(字符轉換輸入流)常用的方法:

public int read():讀取單個字符
public int read(char[] cbuf, int offset,int length):讀取字符數組(讀取的是實際長度)
a.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class 字符輸入流 {
	public static void main(String[] args) throws IOException {
		//創建字符輸入流對象
		InputStreamReader i = new InputStreamReader
				(new FileInputStream("字符輸入流例子.txt"));
		//讀數據
		//一次讀取一個字符
		int x = 0 ;
		while((x=i.read())!=-1){
			System.out.print((char)x);
		}
		//關閉資源
		i.close();
	}
}

b.
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class 字符輸入流2 {
	public static void main(String[] args) throws IOException {
		InputStreamReader isr = new InputStreamReader
				(new FileInputStream("字符輸入流例子.txt"));
		//一次讀取一個字符數組
		char []a = new char[1024];
		int len =0;
		while((len=isr.read(a))!=-1){
			System.out.println(new String(a,0,len));
		}
		isr.close();
	}
}

8.字符輸出流

a.字符轉換輸出流常用方法

i.寫數據:

public void write(int c):寫單個字符
public void write(char[] cbuf):寫一個字符數組
public abstract void write(char[] cbuf, int off,int len):字符數組的一部分
public void write(String str):寫字符串
public void write(String str, int off,int len):寫一部分字符串

ii.刷新

flush():刷新該流的緩衝

b.(面試題)close()方法和flush()方法的區別?

close():關閉跟該流相關的資源,並且關閉之前,一定要刷新,防止出現沒有寫進去的情況,關閉之後不能在寫數據了!

flush():刷新緩衝的流,刷新之後,還可以給文件中寫數據


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

public class 字符輸出流 {
	public static void main(String[] args) throws IOException{
		fun1();
		fun2();
	}

	public static void fun2() throws IOException {
		OutputStreamWriter o = new OutputStreamWriter
				(new FileOutputStream("字符輸出流例子2.txt"));
		o.write("農夫山泉\t有點甜\r農夫山泉\n有點\r\n甜");
		o.close();
	}

	public static void fun1() throws IOException {
		OutputStreamWriter o = new OutputStreamWriter
				(new FileOutputStream("字符輸出流例子1.txt"),"utf-8");
		o.write("農夫山泉有點甜\r\n農夫山泉有點甜");
		o.close();
	}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class 字符輸出流2 {
	public static void main(String[] args) throws IOException {
		OutputStreamWriter osw = new OutputStreamWriter
				(new FileOutputStream("字符輸出流例子3.txt"));
		//開始寫數據:寫單個字符:
//		public void write(int c):寫單個字符
		osw.write('a');
//		osw.write(97);
		
		//public void write(char[] cbuf):寫一個字符數組
//		char[] ch = {'a','b','c','d','e'} ;
//		osw.write(ch);
		
		//public void write(String str):寫字符串
		osw.write("I want something just like this");
		
		//public void write(String str, int off,int len):寫一部分字符串
		osw.write("HelloWorld", 2, 5);
		
		
		//刷新該流的緩衝
		osw.flush();
		//public abstract void write(char[] cbuf,  int off,int len):字符數組的一部分
//		osw.write(ch, 2, 3);
		
		//關閉資源
		osw.close(); 
		//java.io.IOException: Stream closed
//		osw.write(ch, 2, 3);
	
	}
}

9.優化的轉換流的方式

OutputStreamWriter(new FileOutputStream("文件抽象表現形式")):默認編碼
FileWriter + 默認的編碼格式
InputStreamReader(new FileInputStream("路徑名...")):默認編碼
FileReader + 默認編碼格式
類 FileReader(java.io)
public class FileReader extends InputStreamReader
用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩衝區大小都是適當的。要自己指定這些值,可以先在 FileInputStream 上構造一個 InputStreamReader。
常用方法:

public FileReader(String fileName) 在給定從中讀取數據的文件名的情況下創建一個新 FileReader。


10.字符緩衝流裏面有特殊的功能(重點)

a.引出:
字符流爲了提高高效的讀寫操作,所有也引出了,字符緩衝流
將文本寫入字符輸出流,緩衝各個字符,從而提供單個字符、數組和字符串的高效寫入。
b.字符緩衝輸出流:

public BufferedWriter(Writer out)   創建字符緩衝輸出流的對象 默認的緩衝區就足夠大了,所以不用指定緩衝區大小


c.字符緩衝輸入流:
public BufferedReader(Reader in)   創建一個使用默認大小輸入緩衝區的緩衝字符輸入流。
從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。

d.字符緩衝輸出流裏面的特殊方法

public void newLine() throws IOException:寫入一個行的分隔符號


e.字符緩衝輸入流裏面的特殊方法
public String readLine() throws IOException:一次讀取一行

包含該行內容的字符串,不包含任何終止符,如果已到達流末尾,則返回null。

b.

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterDemo {
	public static void main(String[] args) throws IOException {
		//創建字符緩衝輸出流對象
		BufferedWriter bw = new BufferedWriter(new FileWriter("字符緩衝輸出流.txt"));
		//寫數據
		bw.write("Hello");
		bw.write("World");
		bw.flush();
		
		bw.close();
	}
}

c.

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

public class BufferedReadDemo {
	public static void main(String[] args) throws IOException {
		BufferedReader br =new BufferedReader(new FileReader("字符緩衝輸入流.txt"));
		//讀取數據
		//一次讀取一個字符
//		int x = 0 ;
//		while((x=br.read())!=-1){
//			System.out.print((char)x);
//		}
//		
		//一次讀取一個字符數組
		char[]a = new char[1024];
		int len = 0 ;
		while((len=br.read(a))!=-1){
			System.out.println(new String(a,0,len));
		}
	}
}

d.e.

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

/*字符緩衝輸出流的特殊方法
	public void newLine()throws IOException :寫入一個行的分隔符號!
字符緩衝輸入流的特殊方法:
	public String readLine() throws IOExce
*/
public class BufferedDemo特殊方法 {
	public static void main(String[] args) throws IOException {
		Write();
		Read();
	}

	public static void Read() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("字符緩衝輸入流.txt"));
		String line = null;
		while((line=br.readLine())!=null){
			System.out.println(line);
		}
		
		br.close();
	}

	public static void Write() throws IOException {
		BufferedWriter bw = new BufferedWriter(new FileWriter("字符緩衝輸出流BufferedDemo.txt"));
		
		for (int i = 0; i < 10; i++) {
			bw.write("HelloWorld");
			bw.newLine();
			bw.flush();
		}
		bw.close();
	}
}

11.複製文本文件的讀寫操作

a.字符流一次讀取一行進行讀寫操作

b.字符流一次讀取一個字符數組進行讀寫操作

a.

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

//	//一次讀取一行
public class CopyFileDemo02 {
	public static void main(String[] args) throws IOException {
		//創建字符緩衝輸入流對象
		BufferedReader br = new BufferedReader
				(new FileReader("a.txt"));
		//創建字符緩衝輸出流對象
		BufferedWriter bw = new BufferedWriter
				(new FileWriter("b.txt"));
		//一次讀取一行
		String line = null;
		while((line=br.readLine())!=null){
			//讀第一行 寫一行
			bw.write(line);
			//換行
			bw.newLine();
			//刷新
			bw.flush();
		}
		bw.close();
		br.close();
	}
}

b.

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

////一次讀取一個字符數組
public class CopyFileDemo01 {
	public static void main(String[] args) throws IOException {
		//創建字符緩衝輸入流對象
		BufferedReader br = new BufferedReader
				(new FileReader("a.txt"));
		//創建字符緩衝輸出流對象
		BufferedWriter bw = new BufferedWriter
				(new FileWriter("b.txt"));
		//一次讀取一個字符數組
		char []a = new char[1024];
		int len=0;
		while((len=br.read(a))!=-1){
			bw.write(a,0,len);
			bw.flush();
		}
		br.close();
		bw.close();
	}
}

IO流總結:

IO流
|--字節流
|--字節輸入流
InputStream
int read():一次讀取一個字節

int read(byte[] bys):一次讀取一個字節數組


|--FileInputStream
|--BufferedInputStream
|--字節輸出流
OutputStream
void write(int by):一次寫一個字節

void write(byte[] bys,int index,int len):一次寫一個字節數組的一部分


|--FileOutputStream
|--BufferedOutputStream
|--字符流
|--字符輸入流
Reader
int read():一次讀取一個字符

int read(char[] chs):一次讀取一個字符數組


|--InputStreamReader
|--FileReader
|--BufferedReader
String readLine():一次讀取一個字符串
|--字符輸出流
Writer
void write(int ch):一次寫一個字符

void write(char[] chs,int index,int len):一次寫一個字符數組的一部分


|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
void newLine():寫一個換行符
void write(String line):一次寫一個字符串
發佈了51 篇原創文章 · 獲贊 15 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章