文章目錄
一、緩衝流概述
是對前面學習的4個基礎的字節字符流的增強
FileOutputStream
FileInputStream
FileWriter
FIleReader
1. 緩衝流的基本原理
- 1.使用底層流對象從具體設備上獲取數據,並將數存儲到緩衝區的數據內
- 2.通過緩衝區的
read()
方法從緩衝區獲取具體的字符數據,這樣就提高了效率 - 3.如果用
read
方法讀取字符數據,並存儲到另一個容器,直到讀取到了換行符時,將另一個容器臨時存儲的數據轉換爲字符串返回,就形成了readLine()
方法
綜上,也就是說,在創建流對象的時候,會創建一個內置的默認大小的緩衝區數組,通過緩衝區讀寫,減少系統IO次數,從而提高讀寫效率
緩衝流的命名規律是BufferedXXX
- 字節緩衝流:
BufferedInputStream
,BufferedOutputStream
- 字符緩衝流:
BufferedWriter
,BufferedReader
二、字節緩衝流
1. 構造方法
public BufferedInputStream(InputStream in)
:創建一個新得緩衝輸入流、注意參數類型是InputStream
public BufferedOutputStream(OutputStream out)
:創建一個新得緩衝輸出流,注意參數類型是OutputStream
常見寫法
public class Buffered_Demo01 {
public static void main(String[] args) throws FileNotFoundException {
//0. 方式一
FileInputStream fis = new FileInputStream("b.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
//1. 方式二
BufferedInputStream bis2 = new BufferedInputStream(new FileInputStream("c.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d.txt"));
}
}
2. 緩衝流的高效性(緩衝流實現大文件的複製)
-
緩衝流的讀寫方法和普通的基本一致,下面通過複製一個大文件來對比普通字節流和緩衝流的區別
-
文件信息
-
普通字節流複製文件
public class Buffered_Demo02 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
//0. 聲明 字節輸入流輸出流
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//1. 創建輸入流
fis = new FileInputStream("D:\\IO流學習\\test.mkv");
//2. 創建輸出流
fos = new FileOutputStream("D:\\IO流學習\\test_copy.mkv");
//3. 創建大小爲1MB的字節數組
byte[] b = new byte[1024];
int len;
while ((len = fis.read(b)) != -1){
fos.write(b,0,len);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
fis.close();
fos.close();
}catch (IOException e){
e.printStackTrace();
}
}
System.out.println("普通流複製300M文件耗時:" + (System.currentTimeMillis() - start));
}
}
- 緩衝流複製文件
public class Buffered_Demo03 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
//0. 聲明 字節緩衝輸入流輸出流
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
//1. 創建緩衝輸入流
bis = new BufferedInputStream(new FileInputStream("D:\\IO流學習\\test.mkv"));
//2. 創建緩衝輸出流
bos = new BufferedOutputStream(new FileOutputStream("D:\\IO流學習\\test_copy02.mkv"));
//3. 創建大小爲1MB的字節數組
byte[] b = new byte[1024];
int len;
while ((len = bis.read(b)) != -1){
bos.write(b,0,len);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
bis.close();
bos.close();
}catch (IOException e){
e.printStackTrace();
}
}
System.out.println("緩衝流複製300M文件耗時:" + (System.currentTimeMillis() - start));
}
}
- 耗時對比
三、字符緩衝流
1. 構造方法
格式和原理與字節緩衝流完全一致
public BufferedReader(Reader in)
:創建一個新的緩衝輸入流,注意參數類型爲Reader
public BufferedWriter(Writer out)
:創建一個新的緩衝輸出流,注意參數類型爲Writer
2. 字符緩衝流特有方法(readLine()/writeLine())
基本的讀寫方法和普通字符流完全一致
BufferedReader
:public String readLine()
按行讀取數據,讀到最後返回nullBufferedWriter
:public void newLine()
:換行,由系統屬性定義符號
2.1 readLine()
public class Buffered_Demo04 {
public static void main(String[] args) throws IOException {
//0. 創建緩衝字符輸入流
BufferedReader br = new BufferedReader(new FileReader("D:\\IO流學習\\a.txt"));
//1. 定義暫存字符串
String line = null;
while ((line = br.readLine()) != null){
System.out.print(line);
System.out.println();
}
}
}
- 輸出
2.2 newLine()
public class Buffered_Demo05 {
public static void main(String[] args) throws IOException {
//0. 創建緩衝字符輸入流
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IO流學習\\a.txt"));
bw.write("換行");
bw.newLine();
bw.write("寫入");
bw.newLine();
bw.write("是可以的");
bw.close();
}
}
- 輸出
3. 緩衝字符流實現對文本的排序
public class Buffered_Demo06 {
public static void main(String[] args) throws IOException {
Map<String, String> map = new HashMap<>();
//0. 創建緩衝字符輸入流
BufferedReader br = new BufferedReader(new FileReader("D:\\IO流學習\\unSorted.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\IO流學習\\Sorted.txt"));
//1. 讀取數據
String line = null;
while ((line = br.readLine()) != null){
//1.1 按 . 作爲分割符
String[] split = line.split("\\.");
map.put(split[0],split[1]);
}
br.close();
//2. 遍歷map集合
for (int i = 1; i <= map.size(); i++) {
String key = String.valueOf(i);
//2.1 獲取文本
String value = map.get(key);
//2.2 拼接寫入
bw.write(key + "." + value);
//2.3 換行
bw.newLine();
}
bw.close();
}
}
- 輸出