[TOC]
# 字節緩沖流
字節緩沖流根據流的方向,共有2個
* 寫入數據到流中,字節緩沖輸出流 BufferedOutputStream
* 讀取流中的數據,字節緩沖輸入流 BufferedInputStream
它們的內部都包含了一個緩沖區,通過緩沖區讀寫,就可以提高了IO流的讀寫速度
## 字節緩沖輸出流BufferedOutputStream
通過字節緩沖流,進行文件的讀寫操作 寫數據到文件的操作
* 構造方法
public BufferedOutputStream(OutputStream out)創建一個新的緩沖輸出流,以將數據寫入指定的底層輸出流。
~~~
public class BufferedOutputStreamDemo01 {
public static void main(String[] args) throws IOException {
//寫數據到文件的方法
write();
}
/*
* 寫數據到文件的方法
* 1,創建流
* 2,寫數據
* 3,關閉流
*/
private static void write() throws IOException {
//創建基本的字節輸出流
FileOutputStream fileOut = new FileOutputStream("abc.txt");
//使用高效的流,把基本的流進行封裝,實現速度的提升
BufferedOutputStream out = new BufferedOutputStream(fileOut);
//2,寫數據
out.write("hello".getBytes());
//3,關閉流
out.close();
}
}
~~~
## 字節緩沖輸入流 BufferedInputStream
剛剛我們學習了輸出流實現了向文件中寫數據的操作,那么,現在我們完成讀取文件中數據的操作
* 構造方法
public BufferedInputStream(InputStream in)
~~~
/*
* 從文件中讀取數據
* 1,創建緩沖流對象
* 2,讀數據,打印
* 3,關閉
*/
private static void read() throws IOException {
//1,創建緩沖流對象
FileInputStream fileIn = new FileInputStream("abc.txt");
//把基本的流包裝成高效的流
BufferedInputStream in = new BufferedInputStream(fileIn);
//2,讀數據
int ch = -1;
while ( (ch = in.read()) != -1 ) {
//打印
System.out.print((char)ch);
}
//3,關閉
in.close();
}
~~~
## 使用基本的流與高效的流完成復制文件
我們一直在說,高效的流速度快并高效,怎么體現呢?需要通過一個復制文件耗時的比較過程,來體驗一下高效流帶來的快感。
~~~
/*
* 需求:將d:\\test.avi文件進行復制
* 采用4種方式復制
* 方式1: 采用基本的流,一次一個字節的方式復制 共耗時 224613毫秒
* 方式2: 采用基本的流,一個多個字節的方式賦值 共耗時 327毫秒
* 方式3: 采用高效的流,一次一個字節的方式復制 共耗時 2047毫秒
* 方式4: 采用高效的流,一個多個字節的方式賦值 共耗時 96毫秒
*
* 數據源: d:\\test.avi
* 目的地1: d:\\copy1.avi
* 目的地2: d:\\copy2.avi
* 目的地3: d:\\copy3.avi
* 目的地4: d:\\copy4.avi
*
* 實現的步驟:
* 1,指定數據源
* 2,指定目的地
* 3,讀數據
* 4,寫數據
* 5,關閉流
*
*/
public class CopyAVI {
public static void main(String[] args) throws IOException {
//開始計時
long start = System.currentTimeMillis();
//方式1: 采用基本的流,一次一個字節的方式復制
//method1("d:\\test.avi", "d:\\copy1.avi");
//方式2: 采用基本的流,一個多個字節的方式賦值
//method2("d:\\test.avi", "d:\\copy2.avi");
//方式3: 采用高效的流,一次一個字節的方式復制
//method3("d:\\test.avi", "d:\\copy3.avi");
//方式4: 采用高效的流,一個多個字節的方式賦值
method4("d:\\test.avi", "d:\\copy4.avi");
//結束計時
long end = System.currentTimeMillis();
//打印耗時多少毫秒
System.out.println("共耗時 " +(end - start)+ "毫秒");
}
//方式4: 采用高效的流,一個多個字節的方式賦值
private static void method4(String src, String dest) throws IOException {
//1,指定數據源
BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
//2,指定目的地
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
//3,讀數據
byte[] buffer = new byte[1024];
int len = -1;
while ( (len = in.read(buffer)) != -1) {
//4,寫數據
out.write(buffer, 0, len);
}
//5,關閉流
in.close();
out.close();
}
//方式3: 采用高效的流,一次一個字節的方式復制
private static void method3(String src, String dest) throws IOException {
//1,指定數據源
BufferedInputStream in = new BufferedInputStream(new FileInputStream(src));
//2,指定目的地
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dest));
//3,讀數據
int ch = -1;
while ((ch=in.read()) != -1) {
//4,寫數據
out.write(ch);
}
//5,關閉流
in.close();
out.close();
}
//方式2: 采用基本的流,一個多個字節的方式賦值
private static void method2(String src, String dest) throws IOException {
//1,指定數據源
FileInputStream in = new FileInputStream(src);
//2,指定目的地
FileOutputStream out = new FileOutputStream(dest);
//3,讀數據
byte[] buffer = new byte[1024];
int len = -1;
while ( (len=in.read(buffer)) != -1) {
//4,寫數據
out.write(buffer, 0, len);
}
//5,關閉流
in.close();
out.close();
}
//方式1: 采用基本的流,一次一個字節的方式復制
private static void method1(String src, String dest) throws IOException {
//1,指定數據源
FileInputStream in = new FileInputStream(src);
//2,指定目的地
FileOutputStream out = new FileOutputStream(dest);
//3,讀數據
int ch = -1;
while (( ch=in.read()) != -1) {
//4,寫數據
out.write(ch);
}
//5,關閉流
in.close();
out.close();
}
}
~~~
# 字符緩沖流
* 字符緩沖輸入流 BufferedReader
* 字符緩沖輸出流 BufferedWriter
完成文本數據的高效的寫入與讀取的操作
## 字符緩沖輸出流 BufferedWriter
將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。
* 方法:
void newLine() 根據當前的系統,寫入一個換行符
~~~
/*
* BufferedWriter 字符緩沖輸出流
* 方法
* public void newLine()寫入一個行分隔符
*
* 需求: 通過緩沖輸出流寫入數據到文件
* 分析:
* 1,創建流對象
* 2,寫數據
* 3,關閉流
*
*/
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
//創建流
//基本字符輸出流
FileWriter fileOut = new FileWriter("file.txt");
//把基本的流進行包裝
BufferedWriter out = new BufferedWriter(fileOut);
//2,寫數據
for (int i=0; i<5; i++) {
out.write("hello");
out.newLine();
}
//3,關閉流
out.close();
}
}
~~~
## 字符緩沖輸入流 BufferedReader
從字符輸入流中讀取文本,緩沖各個字符,從而實現字符、數組和行的高效讀取。
* 方法
public String readLine() 讀取一個文本行,包含該行內容的字符串,不包含任何行終止符,如果已到達流末尾,則返回 null
~~~
/*
* BufferedReader 字符緩沖輸入流
*
* 方法:
* String readLine()
* 需求:從文件中讀取數據,并顯示數據
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
//1,創建流
BufferedReader in = new BufferedReader(new FileReader("file.txt"));
//2,讀數據
//一次一個字符
//一次一個字符數組
//一次讀取文本中一行的字符串內容
String line = null;
while( (line = in.readLine()) != null ){
System.out.println(line);
}
//3,關閉流
in.close();
}
}
~~~
## 使用字符緩沖流完成文本文件的復制
剛剛我們學習完了緩沖流,現在我們就使用字符緩沖流的特有功能,完成文本文件的復制
~~~
/*
* 采用高效的字符緩沖流,完成文本文件的賦值
*
* 數據源: file.txt
* 目的地: copyFile.txt
*
* 分析:
* 1,指定數據源, 是數據源中讀數據,采用輸入流
* 2,指定目的地,是把數據寫入目的地,采用輸出流
* 3,讀數據
* 4,寫數據
* 5,關閉流
*/
public class CopyTextFile {
public static void main(String[] args) throws IOException {
//1,指定數據源, 是數據源中讀數據,采用輸入流
BufferedReader in = new BufferedReader(new FileReader("file.txt"));
//2,指定目的地,是把數據寫入目的地,采用輸出流
BufferedWriter out = new BufferedWriter(new FileWriter("copyFile.txt"));
//3,讀數據
String line = null;
while ( (line = in.readLine()) != null ) {
//4,寫數據
out.write(line);
//寫入換行符號
out.newLine();
}
//5,關閉流
out.close();
in.close();
}
}
~~~
- 基礎
- 編譯和安裝
- scanner類(鍵盤錄入)
- Random類(隨機數)
- 數組
- 方法
- 類
- ArrayList集合
- char與int
- eclipse
- IDEA
- 變量與常量
- 常用API
- String,StringBuffer,StringBuilder
- 正則,Date,DateFormat,Calendar
- 包裝類,System,Math,Arrays,BigInteger,BigDecimal
- 集合,迭代器,增強for,泛型
- List,set,判斷集合唯一
- map,Entry,HashMap,Collections
- 異常
- IO
- File
- 遞歸
- 字節流
- 字符流
- IO流分類
- 轉換流
- 緩沖流
- 流的操作規律
- properties
- 序列化流與反序列化流
- 打印流
- commons-IO
- IO流總結
- 多線程
- 線程池
- 線程安全
- 線程同步
- 死鎖
- lock接口
- ThreadLoad
- 等待喚醒機制
- 線程狀態
- jdbc
- DBUtils
- 連接池DBCP
- c3p0連接池
- 網絡編程
- 多線程socket上傳圖片
- 反射
- xml
- 設計模式
- 裝飾器模式
- web service
- tomcat
- Servlet
- response
- request
- session和cookie
- JSP
- EL
- JSTL
- 事務
- 監聽器Listener
- 過濾器Filter
- json
- linux安裝軟件
- 反射詳解
- 類加載器和注解
- 動態代理
- jedis
- Hibernate
- 簡介
- 創建映射文件
- Hibernate核心配置文件
- 事務和增刪改查
- HibernateUtils
- 持久化對象的三種狀態
- 檢索方式
- query
- Criteria
- SQLQuery
- 持久化類
- 主鍵生成策略
- 緩存
- 事務管理
- 關系映射
- 注解
- 優化
- struts2
- 搭建
- 配置詳解
- Action
- 結果跳轉方式
- 訪問ServletAPI方式
- 如何獲得參數
- OGNL表達式
- valueStack 值棧
- Interceptor攔截器
- spring
- 導包
- IOC和DI
- Bean獲取與實例化
- Bean屬性注入
- spring注解
- 注解分層
- junit整合
- aop
- 動態代理實現
- cglib代理實現
- aop名詞
- spring的aop
- aop-xml詳解
- aop-注解詳解
- 代理方式選擇
- jdbcTemplate
- spring事務管理
- 回滾注意
- 事務傳播屬性
- MyBatis
- MyBatis簡介
- 入門程序
- 與jdbc hibernate不同
- 原始Dao開發
- Mapper動態代理方式
- SqlMapConfig.xml配置文件
- 輸入參數pojo包裝類
- resultMap
- 動態sql
- 一對一關聯
- 一對多
- 整合spring
- 逆向工程
- maven
- maven簡介
- 倉庫
- maven目錄結構
- maven常用命令
- 生命周期
- eclipse中maven插件
- 入門程序
- 整合struct
- 依賴范圍
- 添加插件
- idea配置
- jar包沖突
- 分模塊開發
- 構建可執行的jar包(包含依賴jar包)
- springMVC
- 處理流程
- java面試
- java版本升級
- java1-8版本變更
- java9新特性
- 鎖
- java資料
- idea
- jdk版本切換
- log4j
- 入門實例
- 基本使用方法
- Web中使用Log4j
- spring中使用log4j
- java代碼優化