
【友情鏈接】???IO流 之 File類 & 遞回
【友情鏈接】???IO流 之 過濾器 & 位元組流
【友情鏈接】???IO流 之字符流 & 屬性集(Properties集合)
【友情鏈接】???IO流 之 緩沖流 & 轉換流
【友情鏈接】???IO流 之 序列化流 & 列印流
一、緩沖流
1. 概述
緩沖流,也叫高效流,是對4個基本的(位元組/字符)(輸入/輸出)流的增強,所以緩沖流也有4個流,
按照資料型別可分為:
- 位元組緩沖流:BufferedInputStream , BufferedOutputStream
- 字符緩沖流: BufferedReader ,BufferedWriter
緩沖流的基本原理,是指在創建流的物件時,同時會創建一個內置的默認大小的緩沖區陣列,通過緩沖區來進行讀寫,可以減少系統的 IO次數,從而能夠提高讀寫的效率,
2.BufferedOutputStream位元組緩沖輸出流
BufferedOutputStream extends OutputStream
該類繼承了父類OutputStream的共性成員方法有:
public void close():關閉此輸出流并釋放與此流相關聯的任何系統資源,
public void flush():重繪此輸出流并強制任何緩沖的輸出位元組被寫出,
public void write(byte[] b)
將b.length位元組從指定的位元組陣列寫入此輸出流,
public void write(byte[ ] b, int off, int len):
從指定的位元組陣列寫入len位元組,從偏移量off開始輸出到此輸出流
public abstract void write (int b) :將指定的位元組輸出流,
BufferedOutputStream的構造方法:
BufferedOutputStream(OutputStream out)
創建一個新的緩沖輸出流,將資料寫入指定的底層輸出流中
BufferedOutputStream(OutputStream out,int size)
創建一個新的緩沖輸出流,
將具有指定緩沖區大小的資料寫入到指定的底層輸出流中
引數:
OutputStream out ;位元組輸出流
可以傳遞FileOutputStream類的物件,
緩沖流會為FiLeOutputStream類的物件增加一個緩沖區,
這樣,會大大提高FileOutputStream的寫入效率
int size:指定緩沖流內部暖沖區的大小,不指定則系統默認大小
位元組緩沖輸出流的使用步驟:
-
1.創建FileOutputStream類的物件并在構造方法中指定要輸出的路徑
-
2.創建BufferedOutputStream類的物件并在構造方法中傳遞FileOutputStream類物件的物件,提高FileOutputStream物件效率
-
3.使用BufferedOutputStream類的物件中的write()方法,將資料寫入到內部的緩沖區中
-
4.使用BufferedOutputStream類的物件中的flush()方法將內部緩沖區中的資料重繪到檔案中去
-
5.釋放資源(先呼叫fLush()方法重繪資料),所以上面的第4步可以省略
示例代碼:
//1.創建FileOutputStream類的物件并在構造方法中指定要輸出的路徑
FileOutputStream fos = new FileOutputStream(
"D:\\BigData\\java\\javalearn\\src\\com\\data\\data1\\test.txt");
// 2.創建BufferedOutputStream類的物件并在構造方法中傳遞FileOutputStream類物件的物件,提高FileOutputStream物件效率
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3.使用BufferedOutputStream類的物件中的write()方法,將資料寫入到內部的緩沖區中
bos.write("北慕辰的字符緩沖輸出流".getBytes());
//4.使用BufferedOutputStream類的物件中的flush()方法將內部緩沖區中的資料重繪到檔案中去
bos.flush();
//5.釋放資源(先呼叫fLush()方法重繪資料),所以上面的第4步可以省略
bos.close();
fos.close();
測驗結果:

3.BufferedIutputStream位元組緩沖輸入流
BufferedInputStream extends InputStream
該流也繼承了父類的共性成員方法:
int read() 從輸入流中讀取資料的下一個位元組,
int read(byte[ ] b)
從輸入流中讀取一定數量的位元組,并將其存盤在緩沖區陣列b中,
void close() 關閉此輸入流并釋放與該流關聯的所有系統資源,
BufferedInputStream的構造方法:
BufferedInputStream(InputStream in)
創建一個BufferedInputStream類的物件并保存其中的引數,
即輸入流in,以便將來使用,
BufferedInputStream(InputStream in, int size)
創建具有指定緩沖區大小的BufferedInputStream類的物件,
并保存其中的引數,即輸入流
構造方法中的引數:
InputStream in : 位元組輸入流
可以傳遞FileInputStream類的物件
級沖流會給FiLeInputStream增加一個緩沖區,
可以大大的提高FileInputStream的讀取效率
int size: 指定緩沖流內部的緩沖區的大小,不指定則系統默認大小
位元組緩沖輸入流使用步騷:
-
1.創建FileInputStream類的物件并在構造方法中指定要讀取的資料源(也就是檔案路徑)
-
2.創建BufferedInputStream類的物件并在構造方法中傳遞已經創建好的FiLeInputStream類的物件, 大大提高了FileInputStream類的物件的讀取效率
-
3.使用BufferedInputStream物件中的read()方法讀取檔案
-
4.呼叫close()方法釋放資源
實體代碼:
//1.創建FileInputStream類的物件并在構造方法中指定要讀取的資料源(也就是檔案路徑)
FileInputStream fis = new FileInputStream(
"D:\\BigData\\java\\javalearn\\src\\com\\data\\data1\\test.txt");
//2.創建BufferedInputStream類的物件并在構造方法中傳遞已經創建好的FiLeInputStream類的物件,
// 大大提高了FileInputStream類的物件的讀取效率
BufferedInputStream bis = new BufferedInputStream(fis);
//3.使用BufferedInputStream物件中的read()方法讀取檔案
// int sum;
// while ((sum=bis.read())!=-1){
// System.out.println(sum);
// }
byte[] bytes=new byte[1024];
int sum=0;//用來記錄每次讀取的位元組個數
while ((sum=bis.read(bytes))!=-1){
System.out.println(new String(bytes,0,sum));
}
//4.呼叫close()方法釋放資源
bis.close();
fis.close();
測驗結果;

4.BufferedWriter:字符緩沖輸出流
BufferedWriter extends Writer
該類繼承了父類Writer的共性成員方法有:
void write(int c) 寫入單個字符
void write(char[]cbuf) 寫入字符陣列
abstractvoid write(char[] cbuf,int off,int len)
寫入字符陣列的某部分, 從off偏移量開始,寫入len個字符數
void write(String str) 寫入字串
void write(String str,int off,int lenb)
寫入字串的某部分,從off偏移量開始,寫入lenb個字符數
void flush() 劇新該流的緩沖
void close() 關閉此流,但要先重繪它
1.BufferedWriter構造方法:
BufferedWriter(Writer out)
創建一個使用認大小輸出緩沖區的緩沖字符輸出流,
BufferedWriter(writer out, int sz)
創建一個使用給定太小輸出緩沖區的新緩沖字符輸出渣,
構造方法的引數:
Writer out:字符輸出凌
可以傳適FileWriter ,
緩沖流會給FileWriter增加一個級沖區,
提高FileWriter的寫入效率
int size: 指定緩沖區的大小,不寫別認大小
2. BufferedWriter中特有的成員方法;
void newLine( )
寫入一個行分隔符,會根據不同的作業系統,獲取不同的行分隔符來換行
換行符號
windows : \r\n
Linux:/n
mac: /r
字符緩沖輸出流使用步騷:
-
1.創建字符緩沖輸出流的物件,并在構造方法中傳遞字符輸出流
-
2.呼叫字符緩沖輸出流中的write()方法,將資料寫入到記憶體緩沖區中
-
3.呼叫字符緩沖輸出流中的flush()方法,將記憶體緩沖區中的資料,重繪到檔案中去
-
4.釋放資源
示例代碼:
//1.創建字符緩沖編出流的物件,在構造方法中傳遞字符輸出流
BufferedWriter bw = new BufferedWriter(
new FileWriter("D:\\BigData\\java\\javalearn\\src\\com\\data\\data1\\test.txt"));
//2.呼叫字符緩沖錦出流中的write()方法,把資料寫入到記憶體緩沖區中
for (int i = 0; i < 5; i++) {
bw.write("北慕辰"+i);
//bw.write("\r\n");
bw.newLine();
}
//3.呼叫字符緩沖輸出流中的flus()方法,將記憶體緩沖區中的資料,重繪到檔案中
bw.flush();
//4.釋放資源
bw.close();
測驗結果:

5.BufferedReader:字符緩沖輸入流
BufferedReader extends Reader
該類繼承了父類Reader的共性成員方法有:
public void close(): 關閉此流并釋放與此流相關聯的任何系統資源,
public int read(: 從輸入流中讀取一個字符,
public int read(char[ ] cbuf):
從輸入流中讀取一些字符,并將它們存盤到字符陣列 cbuf中,
1. BufferedReader類的構造方法:
BufferedReader(Reader in)
創建一個使用系統默認大小的,輸入緩沖區的緩沖字符輸入流,
BufferedReader(Reader in, int size)
創建一個使用指定大小的,輸入緩沖區的緩沖字符輸入流,
引數;
Reader in: 字符輸入流
可以傳遞FileReader,緩沖流會給FileReader增加一個緩沖區,
提高FileReader的讀取效率
2.BufferedReader類的特有的成員方法:
String readiine( ): 讀取一個文本行.
讀取一行資料,行的終止符號,
讀取到、換行(‘ \n ')、回車('\r')或回車后直接跟著換行(\r\n)
字符之一就會認為某行已讀完:
注意:
方法的回傳值為包含該行內容的字串,不包含任何的行終止符,
如果已到達流的末尾,那么就會回傳null
示例代碼;
//1.創建字符緩沖編入流物件,構造方法中傳遞字符涂入流
BufferedReader br = new BufferedReader(
new FileReader("D:\\BigData\\java\\javalearn\\src\\com\\data\\data1\\test.txt"));
//2.使用字行緩中輸入流物件中的方法read / readLine讀取文本
//2.1 read()
// int sum;
// while ((sum=br.read())!=-1){
// System.out.print((char) sum);
// }
//2.2 readLine()
String line;
while ((line=br.readLine())!=null){
System.out.println(line);
}
// 3.釋放資源
br.close();
測驗結果:

二、轉換流
了解什么是字符編碼
我們知道,在計算機中儲存的資訊都是用二進制數表示的,而我們在計算機螢屏上看到的數字、英文、漢字等字符都是計算機將二進制數轉換之后的結果,轉換都是按照某種規則來進行的,將字符存盤到計算機中,一般稱為編碼;將存盤在計算機中的二進制數按照某種規則決議顯示出來,一般稱為解碼, 字符的編碼和解碼需要使用同一種規則,否則就會出現亂碼情況,而,字符編碼 就是指自然語言的字符和二進制數之間轉換的規則,
了解什么是字符集
字符集也稱為編碼表,它是一個系統支持的所有字符的集合,其中包括各個國家的文字、標點符號以及圖形符號、數字等各種字符,編碼表指的就是生活中的文字和計算機中的二進制對應的轉換規則,
下圖是我們常見的字符集:一套字符集必然至少有一個字符編碼
ASCII字符集:
- ASCll ( American Standard Code for Information Interchange,美國資訊交換標準代碼),它是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語,其中主要包括有控制字符(回車鍵、退格、換行鍵等)以及可顯示字符(英文大小寫字符、阿拉伯數字和西文符號),
- 基本的ASCII字符集使用7位 ( bits )來表示一個字符,共有128個字符,而,ASCII的擴展字符集使用8位( bits )來表示一個字符,共256個字符,以方便支持歐洲常用字符,
ISO-8859-1字符集:
- 拉丁碼表,別名Latin-1,它是用于顯示歐洲使用的語言,包括荷蘭、丹麥、德語、意大利語、西班牙語等,
- ISO-8859-1使用單位元組編碼,其也兼容ASCII編碼,
GBxxx字符集:
- GB指的就是國標的意思,是為了顯示中文而專門設計的一套字符集,
- GB2312字符集:簡體中文碼表,一個小于127的字符的意義與原來相同,但兩個大于127的字符連在一起時,就表示一個漢字,這樣大約可以組合了包含7000多個簡體中文漢字,此外數學符號、羅馬希臘的字母、日文的假名們都編進去了,而且在ASCII里本來就有的數字、標點、字母都統統重新編了兩個位元組長的編碼,這就是我們常說的全角字符,而原來在127號以下的那些就叫半角字符了,
- GBK:是最常用的中文碼表,它是在GB2312標準基礎上的擴展規范,使用了雙位元組編碼方案 ,一共收錄了21003個漢字,完全兼容GB2312標準,同時支持繁體漢字以及日韓漢字等,
- GB18030字符集:是最新的中文碼表,它收錄了漢字70244個,采用多位元組偏碼,每個字可以由1個、2個或4個位元組組成,并且它支持中國國內少數民族的文字,同時支持繁體漢字以及日韓漢字等,
Unicode字符集:
- Unicode編碼系統是為表達任意語言的任意字符而設計的,是業界的一種標準,也稱為統一碼、標準萬國碼,
- 它最多使用4個位元組的數字來表達每個字母、符號,或者文字,有三種編碼方案分別是UTF-8、UTF-16和UTF-32,其中最為常用的UTF-8編碼,
- UTF-8編碼,可以用來表示Unicode標準中任何字符,它是電子郵件、網頁以及其他存盤或者傳送文字的應用中優先采用的編碼,互聯網工程作業小組(IETF ) 要求所有的互聯網協議都必須支持UTF-8編碼,所以,我們開發的Web應用,也需要使用UTF-8編碼,它使用一至四個位元組為每個字符編碼,它的編碼規則如下:
- 1、128個US-ASCII字符,只需要一個位元組編碼,
- 2、拉丁文等字符,需要兩個位元組編碼,
- 3、大部分常用字(含中文),使用三個位元組編碼,
- 4、其他極少使用的Unicode輔助字符,使用四位元組編碼,
轉換流的特點就是可以指定任意格式的編碼
1. OutputStreamWriter
在java.io包下的OutputStreamWriter 繼承了 Writer類,OutputStreamWriter類,是字符流通向位元組流的橋梁,它可以使用指定的字符集charset,將要寫入流中的字符編碼成位元組,
該類繼承了父類Writer的共性成員方法有:
void write(int c) 寫入單個字符
void write(char[]cbuf) 寫入字符陣列
abstractvoid write(char[] cbuf,int off,int len)
寫入字符陣列的某部分, 從off偏移量開始,寫入len個字符數
void write(String str) 寫入字串
void write(String str,int off,int lenb)
寫入字串的某部分,從off偏移量開始,寫入lenb個字符數
void flush() 劇新該流的緩沖
void close() 關閉此流,但要先重繪它
OutputStreamWriter的構造方法
1. OutputStreamWriter(Outputstream out)
創建使用默認字符編碼的OutputStreamWriter類的物件
2. OutputStreamWriter(OutputStream out,String charsetName)
創建使用指定字符集的 OutputStreamWriter類的物件
方法中的引數:
OutputStream out指位元組輸出流,可以用來將轉換之后的位元組寫入到檔案中
String charsetName 是指定的編碼表的名稱,它不區分大小寫,
可以是utf-8/UTF-8, gbk/GBK 等,若不指定,那么會默認使用utf-8
OutputStreamWriter的使用步驟:
- 1.創建OutputStreamWriter類的物件,并在杓造方法中傳遞位元組輸出流和指定的編碼表名稱
- 2.使用OutputStreamWriter類的物件中的write()方法,把字符轉換為位元組存盤在緩沖區中(編碼)
- 3.使用OutputStreamWriter類的物件中的fliush()方法,把記憶體緩沖區中的位元組重繪到檔案中去
- 4.呼叫close()方法,釋放資源
2. InputStreamReader
在java.io包下的InputStreamReader繼承了Reader類, InputStreamReader類,是位元組流通向字符流的橋梁,它可以使用指定的字符集charset,讀取位元組并將其解碼為字符,
InputStreamReader類的構造方法:
1. InputStreamReader(Inputstream in)
創建一個使用默認字符集的InputStreamReader類的物件,
2. InputStreamReader(Inputstreom in,String chorsetNome)
創建一個使用指定字符集的InputStreomReader類的物件
構造方法的引數:
InputStreae in :位元組輸入流,用來讀取檔案中保存的位元組
String charsetName 是指定的編碼表的名稱,它不區分大小寫,
可以是utf-8/UTF-8, gbk/GBK 等,若不指定,那么會默認使用utf-8
InputStreamReader的使用步婆:
- 1.創建InputStreomReader物件并在杓造方法中傳遞位元組輸入流和指定的編碼表的名稱
- 2.使用InputStreoamReader類的物件中的read()方法,讀取檔案
- 3.呼叫close()方法,釋放資源
注意:
構造方法中指定的編碼表名稱要和檔案的編碼相同,否則產生亂碼

制作不易,各位友友們,大佬們給點鼓勵!
點贊👍 👍 👍 收藏+關注 一鍵三連走起!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/290910.html
標籤:其他
