目錄
- 緩沖流
- 緩沖流原理
- 位元組緩沖流
- BufferedOutputStream:位元組緩沖輸出流
- 構造方法
- 引數
- 使用步驟
- BufferedInputStream:位元組緩沖輸入流
- 構造方法
- 小貼士
- 每次讀取單個位元組
- 每次讀取自定義位元組個數
- 位元組緩沖流復制粘貼圖片【效率更高了】
- BufferedOutputStream:位元組緩沖輸出流
- 字符緩沖流
- BufferedWriter:字符緩沖輸出流
- 繼承自父類的共性成員方法
- 構造方法
- 引數
- 字符緩沖輸出流BufferedWriter特有的成員方法
- 使用步驟
- 字符緩沖輸入流
- 繼承自父類的共性成員方法
- 構造方法
- 引數
- 字符緩沖輸入流BufferedReader特有的成員方法
- 回傳值
- 使用步驟
- BufferedWriter:字符緩沖輸出流
- 練習
- 對文本內容進行排序
緩沖流
除了位元組輸入/輸出流、字符輸入/輸出流這四種輸出流以外,還有一些更強大的流,
比如能高速讀寫的緩沖流,能夠轉換編碼的轉換流,能夠持久化存盤物件的序列化流等等
這些更為強大的流都是在基本的流物件基礎之上創建而來的,就像穿上鎧甲的武士一樣,相當于是對基本的流物件的一種增強,
緩沖流原理

緩沖流也叫高效流,是對四個基本File流物件的增強【位元組輸入/輸出流、字符輸入/輸出流】,所以緩沖流也是四個流,
緩沖流按資料型別分類:
- 位元組緩沖流:BufferedInputStrem,BufferedOutptStrem
- 字符緩沖流:BufferedReader,BufferedWriter
緩沖流基本原理:在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖區讀寫,減少系統IO次數,從而提高讀寫的效率,
位元組緩沖流
BufferedOutputStream:位元組緩沖輸出流
構造方法
- BufferedOutputStream(OutputStream out)
創建一個新的緩沖輸出流,以將資料寫入指定的底層輸出流, - BufferedOutputStream(OutputStream out, int size)
創建一個新的緩沖輸出流,以將具有指定緩沖區大小的資料寫入指定的底層輸出流,
引數
- OutputStream out:位元組輸出流 傳入一個FileOutputStream,緩沖流就會給FileOutputStream增加一個緩沖區,提高FileOutputStream的寫入效率
- int size:指定緩沖流的內部緩沖區大小,如果不指定,就是默認大小
使用步驟
- 創建一個位元組輸出流物件FileOutputStream,構造方法中系結要輸出的目的地
- 創建位元組緩沖流物件BufferedOutputStream,構造方法中傳遞位元組輸出流物件FileOutputStream,提高FileOutputStream的寫入效率
- 使用BufferedOutputStream中的方法write,把資料寫入到內部緩沖區中
- 使用BufferedOutputStream中的方法flush,把內部緩沖區中的資料重繪到檔案中
- 釋放資源(會先呼叫flush方法重繪資料,第4步可以省略)
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
java.lang.Object
繼承者 java.io.OutputStream
繼承者 java.io.FilterOutputStream
繼承者 java.io.BufferedOutputStream
BufferedOutputStream:位元組緩沖輸出流
繼承自父類的共性成員方法:
void close() 關閉此輸出流并釋放與此流有關的所有系統資源,
void flush() 重繪此輸出流并強制寫出所有緩沖的輸出位元組,
void write(byte[] b) 將 b.length 個位元組從指定的 byte 陣列寫入此輸出流,
void write(byte[] b, int off, int len) 將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此輸出流,
abstract void write(int b) 將指定的位元組寫入此輸出流,
構造方法:
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步可以省略)
*/
public class DemosBuffered1 {
public static void main(String[] args) throws IOException {
show1();
}
private static void show1() throws IOException {
FileOutputStream fos = new FileOutputStream("FileAndIO\\src\\main\\java\\abc.txt\\a.txt",true);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(97);//a
bos.flush();
bos.close();
}
}

BufferedInputStream:位元組緩沖輸入流
構造方法
- BufferedInputStream(InputStream in)
創建一個 BufferedInputStream 并保存其引數,即輸入流 in,以便將來使用, - BufferedInputStream(InputStream in, int size)
創建具有指定緩沖區大小的 BufferedInputStream 并保存其引數,即輸入流 in,以便將來使用,
小貼士
不同編碼方式1個英文字母占的位元組是不同的:
- ASCII碼:英文字母(無大小寫)占一個位元組的空間,中文字符占兩個位元組的空間,
- utf-8編碼:一個英文字符等于一個位元組,一個中文(含繁體)等于三個位元組,中文的標點符號需要三個位元組,英文的標點符號需要一個位元組,
- Unicode編碼:英文編碼是兩個位元組,中文編碼是兩個位元組,標點符號在漢語中占兩個位元組,在英語中占兩個位元組,
- read() : 從輸入流中讀取資料的下一個位元組,回傳0到255范圍內的int位元組值,如果因為已經到達流末尾而沒有可用的位元組,則回傳-1,在輸入資料可用、檢測到流末尾或者拋出例外前,此方法一直阻塞,
- read(byte[] b) : 從輸入流中讀取一定數量的位元組,并將其存盤在緩沖區陣列 b 中,以整數形式回傳實際讀取的位元組數,在輸入資料可用、檢測到檔案末尾或者拋出例外前,此方法一直阻塞,
每次讀取單個位元組
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/*
java.lang.Object
繼承者 java.io.InputStream
繼承者 java.io.FilterInputStream
繼承者 java.io.BufferedInputStream
BufferedInputStream:位元組緩沖輸入流
繼承自父類的共性成員方法:
int read()從輸入流中讀取資料的下一個位元組
int read(byte[] b)從輸入流中讀取一定數量的位元組,并將其存盤在緩沖區陣列 b 中
void close() 關閉此輸入流并釋放與該流關聯的所有資源
構造方法:
BufferedInputStream(InputStream in)
創建一個 BufferedInputStream 并保存其引數,即輸入流 in,以便將來使用,
BufferedInputStream(InputStream in, int size)
創建具有指定緩沖區大小的 BufferedInputStream 并保存其引數,即輸入流 in,以便將來使用,
引數:
InputStream in:位元組輸入流 傳入一個FileInputStream,緩沖流就會給FileInputStream增加一個緩沖區,提高FileInputStream的讀取效率
int size:指定緩沖流的內部緩沖區大小,如果不指定,就是默認大小
使用步驟:
1.創建一個位元組輸出流物件FileInputStream,構造方法中系結要讀取的資料源
2.創建位元組緩沖流物件BufferedInputStream,構造方法中傳遞位元組輸出流物件FileInputStream,提高FileInputStream的讀取效率
3.使用BufferedInputStream中的方法read,讀取檔案
4.釋放資源
*/
public class DemosBuffered2 {
public static void main(String[] args) throws IOException {
show1();
}
private static void show1() throws IOException {
FileInputStream fis = new FileInputStream("FileAndIO\\src\\main\\java\\abc.txt\\a.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
// int read = bis.read();//一次讀一個位元組
//利用while回圈讀取整個檔案
int len = 0;
while ((len = bis.read())!=-1){
System.out.print(len);
}
bis.close();
}
}
每次讀取自定義位元組個數
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/*
java.lang.Object
繼承者 java.io.InputStream
繼承者 java.io.FilterInputStream
繼承者 java.io.BufferedInputStream
BufferedInputStream:位元組緩沖輸入流
繼承自父類的共性成員方法:
int read()從輸入流中讀取資料的下一個位元組
int read(byte[] b)從輸入流中讀取一定數量的位元組,并將其存盤在緩沖區陣列 b 中
void close() 關閉此輸入流并釋放與該流關聯的所有資源
構造方法:
BufferedInputStream(InputStream in)
創建一個 BufferedInputStream 并保存其引數,即輸入流 in,以便將來使用,
BufferedInputStream(InputStream in, int size)
創建具有指定緩沖區大小的 BufferedInputStream 并保存其引數,即輸入流 in,以便將來使用,
引數:
InputStream in:位元組輸入流 傳入一個FileInputStream,緩沖流就會給FileInputStream增加一個緩沖區,提高FileInputStream的讀取效率
int size:指定緩沖流的內部緩沖區大小,如果不指定,就是默認大小
使用步驟:
1.創建一個位元組輸入流物件FileInputStream,構造方法中系結要讀取的資料源
2.創建位元組緩沖輸入流物件BufferedInputStream,構造方法中傳遞位元組輸入流物件FileInputStream,提高FileInputStream的讀取效率
3.使用BufferedInputStream中的方法read,讀取檔案
4.釋放資源
*/
public class DemosBuffered2 {
public static void main(String[] args) throws IOException {
show1();
}
private static void show1() throws IOException {
FileInputStream fis = new FileInputStream("FileAndIO\\src\\main\\java\\abc.txt\\a.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
// int read = bis.read();
//利用while回圈讀取整個檔案【且一次讀取自定義位元組個數】
int len = 0;
byte[] bytes = new byte[1024];//每次讀取1024個位元組,可提高讀取效率
while ((len = bis.read(bytes))!=-1){
System.out.println(len);//a.txt檔案中位元組個數為36
System.out.print(new String(bytes,0,len));
}
bis.close();
}
}
位元組緩沖流復制粘貼圖片【效率更高了】
import java.io.*;
public class DemosBufferedCopy {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();//開始計時(用來計算程式執行時間)
//注意:讀的檔案是什么格式,寫的目的地就要是什么格式的檔案,寫的目的地不能是檔案夾
FileInputStream fis = new FileInputStream("C:\\Users\\98398\\Desktop\\我的截圖\\wallhaven-o333pp.jpg");//要復制的圖片的地址
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream("E:\\IdeaProjects\\spring-study\\FileAndIO\\src\\main\\java\\abc.txt\\3.jpg");//粘貼圖片目的地的地址【必須有一個圖片格式的檔案地址】
BufferedOutputStream bos = new BufferedOutputStream(fos);
int len = 0;
byte[] bytes = new byte[1024];
while ((len = bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
//釋放資源(先關閉寫的,后關閉讀的)
bos.close();
bis.close();
long end = System.currentTimeMillis();//結束計時(用來計算程式執行時間)
System.out.println("復制檔案耗時"+(end-start)+"ms");
}
}
字符緩沖流
BufferedWriter:字符緩沖輸出流
java.lang.Object
繼承者 java.io.Writer
繼承者 java.io.BufferedWriter
繼承自父類的共性成員方法
- 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) 寫入字串的某一部,
構造方法
- BufferedWriter(Writer out)
創建一個使用默認大小輸出緩沖區的緩沖字符輸出流, - BufferedWriter(Writer out, int sz)
創建一個使用給定大小輸出緩沖區的新緩沖字符輸出流,
引數
- Writer out:一個字符輸出流,傳遞一個FileWriter,緩沖流會給FileWriter增加一個緩沖區,提高FileWriter的寫入效率
- int sz:指定緩沖區的大小,不寫就是默認大小
字符緩沖輸出流BufferedWriter特有的成員方法
- void newLine()
寫入一個行分隔符, 會更具不同的作業系統獲取不同的行分隔符
使用步驟
- 創建一個字符輸出流物件FileOutputStream,構造方法中系結要輸出的目的地
- 創建字符緩沖輸出流物件BufferedWriter,構造方法中傳遞字符輸出流物件FileOutputStream,提高FileOutputStream的讀取效率
- 使用BufferedWriter中的方法write,把資料寫入到記憶體緩沖區中
- 呼叫字符緩沖輸出流中的方法flush,把記憶體緩沖區中的資料書信到檔案中
- 釋放資源
import java.io.*;
/*
BufferedWriter:字符緩沖輸出流
java.lang.Object
繼承者 java.io.Writer
繼承者 java.io.BufferedWriter
繼承自父類的共性成員方法:
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)== 寫入字串的某一部,
構造方法:
BufferedWriter(Writer out)
創建一個使用默認大小輸出緩沖區的緩沖字符輸出流,
BufferedWriter(Writer out, int sz)
創建一個使用給定大小輸出緩沖區的新緩沖字符輸出流,
引數:
Writer out:一個字符輸出流,傳遞一個FileWriter,緩沖流會給FileWriter增加一個緩沖區,提高FileWriter的寫入效率
int sz:指定緩沖區的大小,不寫就是默認大小
字符緩沖輸出流BufferedWriter特有的成員方法
void newLine()
寫入一個行分隔符, 會更具不同的作業系統獲取不同的行分隔符
使用步驟
1. 創建一個字符輸出流物件FileOutputStream,構造方法中系結要輸出的目的地
2. 創建字符緩沖輸出流物件BufferedWriter,構造方法中傳遞字符輸出流物件FileOutputStream,提高FileOutputStream的讀取效率
3. 使用BufferedWriter中的方法write,把資料寫入到記憶體緩沖區中
4. 呼叫字符緩沖輸出流中的方法flush,把記憶體緩沖區中的資料書信到檔案中
5. 釋放資源
*/
public class DemosBufferedWriter {
public static void main(String[] args) throws IOException {
show1();
}
private static void show1() throws IOException {
FileWriter fw = new FileWriter("FileAndIO\\src\\main\\java\\abc.txt\\a.txt",true);
BufferedWriter bw = new BufferedWriter(fw);
for (int i = 0; i < 10; i++) {
// bw.write("\r\n");//每次寫入資料并換行
bw.newLine();//換行
bw.write("追寫的資料");
}
bw.flush();
bw.close();
}
}
字符緩沖輸入流
java.lang.Object
繼承者 java.io.Reader
繼承者 java.io.BufferedReader
繼承自父類的共性成員方法
- int read() 讀取單個字符并回傳
- int read(char[] cbuf)一次讀取多個字符,將字符讀入陣列
- void close() 關閉此輸入流并釋放與該流關聯的所有資源
構造方法
- BufferedReader(Reader in) 創建一個使用默認大小輸入緩沖區的緩沖字符輸入流,
- BufferedReader(Reader in, int sz) 創建一個使用指定大小輸入緩沖區的緩沖字符輸入流,
引數
- Reader in:一個字符輸入流,傳遞一個FileReader,緩沖流會給FileReader增加一個緩沖區,提高FileReader的讀取效率
- int sz:指定緩沖區的大小,不寫就是默認大小
字符緩沖輸入流BufferedReader特有的成員方法
- ? void readLine()
? 讀取一行文本,讀取一行資料
? 行的終符號:通過下列字符之一即可認為某行已終止:換行 ('\n')、回車 ('\r') 或回車后直接跟著換行,
回傳值
- 包含該行內容的字串,不包含任何行終止符,如果已到達流末尾,則回傳 null
使用步驟
- 創建一個字符輸入流物件FileInputStream,構造方法中系結要讀取的資料源
- 創建字符緩沖輸入流物件BufferedReader,構造方法中傳遞字符輸入流物件FileInputStream,提高FileInputStream的讀取效率
- 使用BufferedReader中的方法read/readLine,讀取文本
- 釋放資源
import java.io.*;
/*
BufferedReader:字符緩沖輸入流
java.lang.Object
繼承者 java.io.Reader
繼承者 java.io.BufferedReader
繼承自父類的共性成員方法:
int read() 讀取單個字符并回傳
int read(char[] cbuf)一次讀取多個字符,將字符讀入陣列
void close() 關閉此輸入流并釋放與該流關聯的所有資源
構造方法:
BufferedReader(Reader in) 創建一個使用默認大小輸入緩沖區的緩沖字符輸入流,
BufferedReader(Reader in, int sz) 創建一個使用指定大小輸入緩沖區的緩沖字符輸入流,
引數:
Reader in:一個字符輸入流,傳遞一個FileReader,緩沖流會給FileReader增加一個緩沖區,提高FileReader的讀取效率
int sz:指定緩沖區的大小,不寫就是默認大小
字符緩沖輸入流BufferedReader特有的成員方法
void readLine()
讀取一行文本,讀取一行資料
行的終符號:通過下列字符之一即可認為某行已終止:換行 ('\n')、回車 ('\r') 或回車后直接跟著換行,
回傳值:
包含該行內容的字串,不包含任何行終止符,如果已到達流末尾,則回傳 null
使用步驟
1. 創建一個字符輸入流物件FileInputStream,構造方法中系結要讀取的資料源
2. 創建字符緩沖輸入流物件BufferedReader,構造方法中傳遞字符輸入流物件FileInputStream,提高FileInputStream的讀取效率
3. 使用BufferedReader中的方法read/readLine,讀取文本
4. 釋放資源
*/
public class DemosBufferedReader {
public static void main(String[] args) throws IOException {
show1();
}
private static void show1() throws IOException {
FileReader fr = new FileReader("FileAndIO\\src\\main\\java\\abc.txt\\a.txt");
BufferedReader br = new BufferedReader(fr);
// String line = br.readLine();//讀取一行代碼
// System.out.println(line);
//while回圈讀取整個檔案
String line1;
while ((line1 = br.readLine())!=null){
System.out.println(line1);
}
//釋放資源
br.close();
}
}
練習
對文本內容進行排序
3.醉不成歡慘將別,別時茫茫江浸月,
1.潯陽江頭夜送客,楓葉荻花秋瑟瑟,
6.移船相近邀相見,添酒回燈重開宴,
4.忽聞水上琵琶聲,主人忘歸客不發.
2.主人下馬客在船,舉酒欲飲無管弦,
7.千呼萬喚始出來,猶抱琵琶半遮面,
5.尋聲暗問彈者誰?琵琶聲停欲語遲,
import java.io.*;
import java.util.HashMap;
/*
練習:
對文本內容進行排序
按照(1,2,3,4,5,6...)順序排序
分析:
1.創建一個HashMap集合物件,可以:存盤每行文本的序號(1,2,3,...)value:存盤每行文本內容
2.創建字符緩沖輸入流物件,構造方法中系結字符輸入流
3.創建字符緩沖輸出流物件,構造方法中系結字符輸出流
4.使用字符緩沖輸入流中的方法readLine(),逐行讀取文本
5.對讀取到的文本進行切割,獲取行號中的序號和文本內容
6.把切割好的序號和文本的內容存盤到HashMap集合中(key的序號是有序的,會自動排序1,2,3,4,...)
7.遍歷HashMap集合,獲取每一個鍵值對
8.把每一個鍵值對,拼接為一個文本行
9.把拼接好的文本行,使用字符緩沖輸出流中的方法write,寫入到檔案中
10.釋放資源
小貼士:
split() 方法根據匹配給定的正則運算式來拆分字串,
注意: . 、 $、 | 和 * 等轉義字符,必須得加 \\,
注意:多個分隔符,可以用 | 作為連字符,
語法
public String[] split(String regex, int limit)
引數
regex -- 正則運算式分隔符,
limit -- 分割的份數,
回傳值
字串陣列,
*/
public class IO練習_文本排序 {
public static void main(String[] args) throws IOException {
HashMap<String, String> map = new HashMap<>();
BufferedReader br = new BufferedReader(new FileReader("FileAndIO\\src\\main\\java\\abc.txt\\g.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("FileAndIO\\src\\main\\java\\abc.txt\\h.txt"));
String line;
while ((line = br.readLine())!=null){
//分割每一行
String[] arr = line.split("\\.");
//每行,分割開后是(序號,內容)
for (String s : arr) {
System.out.println(s);
}
map.put(arr[0],arr[1]);
}
for (String key :map.keySet()) {
String value = https://www.cnblogs.com/niuniu-/archive/2021/05/06/map.get(key);
line = key +"." + value;
bw.write(line);
bw.newLine();//換行
}
bw.close();
br.close();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/283101.html
標籤:其他
下一篇:python將位元組轉換為字串
