JavaIO 總結筆記 緩衝流和轉換流
一、緩衝流
1.緩衝區 基本位元組流沒有緩衝區 基本字元流有緩衝區(8K)
2.對於基本位元組流,Java後來提供了位元組流的緩衝流和字元流的緩衝流
3.緩衝流
java.io.BufferedInputStream 位元組緩衝流(讀)
java.io.BufferedOutputStream 位元組緩衝流(寫)
java.io.BufferedReader 字元緩衝流(讀)
java.io.BufferedWriter 字元緩衝流(寫)
二、BufferedOutputStream類
1.作用 把記憶體中的資料寫入到硬碟的某個檔案中(有緩衝區)
2.構造方法
public BufferedOutputStream(OutputStream out) 預設大小是8k
public BufferedOutputStream(OutputStream out, int size)可以自己指定緩衝區大小,單位位元組
3.功能方法
public void write(int b) 引數是ASCII表中的碼值,不是普通數字
public void write(byte[] b)
public void flush()
程式碼舉例:
public static void writeFileByBufferByte() throws IOException {
//演示BufferedOutputStream類
//1.建管道
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(fileName_destination));
//BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("demo.txt"),32*1024);
//2.寫資料
bos.write(97);
bos.write("\r\nhello你好".getBytes("GBK"));
//3.關閉
bos.close();
}
三、BufferedInputStream類
1.作用 把硬碟中某個檔案的資料讀取到記憶體中(有緩衝區)
2.構造方法
public BufferedInputStream(InputStream in) 預設緩衝區是8k
public BufferedInputStream(InputStream out, int size)可以自己指定緩衝區大小,單位位元組
3.功能方法
public int read()
public int read(byte[] b)
public void close()
程式碼舉例:
public static void readFile() throws IOException {
//演示BufferedInputStream類
//1.建管道
File f = new File(fileName_source);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
//BufferedInputStream bis=new BufferedInputStream(new FileInputStream("demo.txt"),32*1024);
//2.讀取資料
// public int read() 一次讀取一個位元組並返回,如果到檔案最後了,返回-1
int res;
do {
res = bis.read();
System.out.print((char) res);
} while (res != -1);
//4.關閉
bis.close();
}
public static void readFileByBufferByte() throws IOException {
//演示BufferedInputStream類
//1.建管道
File f = new File(fileName_source);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));
//BufferedInputStream bis=new BufferedInputStream(new FileInputStream(fileName_source),32*1024);
//2.來輛車
byte[] t = new byte[(int) f.length()];
//3.裝車
bis.read(t);
System.out.println(new String(t));
//4.關閉
bis.close();
}
四、複製檔案
在實際開發時,對於較大檔案的複製,推薦使用緩衝流
public static void copy03_BufferIOStream() throws IOException {
//使用位元組緩衝流複製檔案
//1.建兩個管道
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(fileName_source));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(fileName_destination));
//2.來輛車
byte[] t=new byte[8*1024];
//3.邊讀邊寫
while(true){
int res=bis.read(t);
if(res==-1)
break;
bos.write(t, 0, res);
}
//4.關閉
bis.close();
bos.close();
}
五、BufferedWriter類
1.作用 把記憶體中的資料寫入到硬碟的某個檔案中(緩衝區的大小是可以自己設定的)
2.構造方法
public BufferedWriter(Writer out) 預設大小是8k
public BufferedWriter(Writer out, int sz)可以自己指定緩衝區大小,單位位元組
3.功能方法
public void write(char[] cbuf)
public void write(String str)
public void newLine() \r\n 特有方法,優勢是跨平臺
public void flush()
public void close()
程式碼舉例:
public static void writeFile() throws IOException {
//演示BufferedWriter類
//1.建管道
BufferedWriter bw=new BufferedWriter(new FileWriter(fileName_destination));
//BufferedWriter bw=new BufferedWriter(new FileWriter("fileName_destination"),16*1024);
//2.寫資料
bw.write("hello");
bw.newLine(); //跨平臺
bw.write("world 你好世界");
//3.關閉
bw.close();
}
六、BufferedReader類
1.作用 把硬碟中某個檔案的資料讀取到記憶體中(緩衝區的大小可以自己設定)
2.構造方法
public BufferedReader(Reader in) 預設大小是8k
public BufferedReader(Reader in, int sz)可以自己指定緩衝區大小,單位位元組
3.功能方法
public int read()
public int read(char[] cbuf)
public String readLine() 特有方法 碰到換行或回車即一行結束
public void close()
public static void readFile() throws IOException {
//演示BufferedReader類
//1.建管道
BufferedReader br=new BufferedReader(new FileReader(fileName_source));
//BufferedReader br=new BufferedReader(new FileReader("fileName_source"),16*1024);
//2.獨有方法
String s;
do {
s=br.readLine();
System.out.println(s);
} while (s!=null);
//3.關閉
br.close();
}
七、轉換流
1.所有檔案最終都是以位元組形式儲存在硬碟上,但是使用者在讀寫時需要的是字元,因此字元和位元組之間需要互相轉換。
位元組到字元是讀(輸入流),字元到位元組是寫(輸出流)。
2.轉換時需要按照某種字元編碼進行轉換,常見的編碼有:ISO-8859-1(西方字元) UTF-8(國際通用標準) GBK(中國國家標準)
3.在UTF-8編碼標準中,一個漢字佔三個位元組;在GBK編碼標準中,一個漢字佔兩個位元組(請使用Eclipse更改檔案編碼格式)
4.中文Win作業系統預設編碼GBK,Java中的char和String在儲存漢字時採用GBK編碼
5.當檔案的編碼跟系統預設編碼不一致時,就會出現中文亂碼問題,就需要用到Java的轉換流來解決
6.InputStreamReader 是位元組流通向字元流的橋樑,起到轉換作用(讀)
OutputStreamWriter 是字元流通向位元組流的橋樑,起到轉換作用(寫)
7.思考:今天要講的轉換流需要讀寫檔案?之前講的基本流已經有了讀寫檔案的功能?那麼轉換流還需要自己再實現讀寫檔案的功能嗎?
八、InputStreamReader類
1.作用 讀取 輸入流 把硬碟上某個檔案的二進位制位元組資料轉換為字元
2.構造方法
public InputStreamReader(InputStream in) 預設字元編碼GBK
public InputStreamReader(InputStream in, String charsetName)可以自己指定編碼(要跟檔案編碼一致)
3.功能方法
public int read()
public int read(char[] cbuf)
程式碼舉例:
public static void readByInputStreamReader() throws IOException {
//演示InputStreamReader類 從位元組轉換為字元
//1.建管道
File f = new File(fileName_source);
InputStreamReader isr=new InputStreamReader(new FileInputStream(f),"UTF-8");
//2.來輛車
char[] c=new char[(int)f.length()];
//3.裝車
isr.read(c);
System.out.println(new String(c).trim());
//4.關閉
isr.close();
}
九、OutputStreamWriter類
1.作用 寫 輸出流 把字元轉換為位元組存到硬碟上
2.構造方法
public OutputStreamWriter(OutputStream out) 預設字元編碼GBK
public OutputStreamWriter(OutputStream out, String charsetName)可以自己指定編碼(要跟檔案編碼一致)
3.功能方法
public void write(int c)
public void write(char[] cbuf)
public void write(String str)
public void flush()
public void close()
程式碼舉例:
public static void writeByOutputStreamWriter() throws IOException {
//演示OutputStreamWriter類 把字元轉換為位元組
//1.建管道
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(fileName_destination),"UTF-8");
//2.寫資料
osw.write("中國");
//3.關閉
osw.close();
}
十、另一種解決中文亂碼檔案的方式
1.先打回原形
2.重新組合成字串,可以設定編碼
十一、基本流、緩衝流和轉換流
用基本位元組流讀寫文字檔案,也需要在位元組和字元之間轉換,getBytes() new String()
用基本字元流讀寫文字檔案,也需要在位元組和字元之間轉換,字元流的爸爸是轉換流
十二、總結基本流、緩衝流和轉換流的應用場景?
1.基本流 檔案小 編碼是gbk
2.緩衝流 檔案大
3.轉換流 編碼跟系統不一致
十三、裝飾設計模式
1.如果我想在不改變某類原始碼的前提下,擴充套件該類中某個方法的功能
a.繼承-方法重寫,會造成子類非常臃腫,子類會越來越龐大
class A{
public void a(){}
public void b(){}
public void c(){}
public void d(){}
public void e(){}
}
class B extends A{
public void a(){
}
}
b.裝飾設計模式
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(…)))
專案地址:傳送門