[TOC]
# 字節流
## 字節輸出流OutputStream
OutputStream此抽象類,是表示輸出字節流的所有類的超類。操作的數據都是字節,定義了輸出字節流的基本共性功能方法。
輸出流中定義都是寫write方法

**FileOutputStream類**
OutputStream有很多子類,其中子類FileOutputStream可用來寫入數據到文件。
FileOutputStream類,即文件輸出流,是用于將數據寫入 File的輸出流。

在FileOutputStream的構造函數中,可以接受一個boolean類型的值,如果值true,就會在文件末位繼續添加

~~~
public static void main(String[] args) throws Exception {
File file = new File("c:\\file.txt");
FileOutputStream fos = new FileOutputStream(file, true);
String str = "\r\n"+"java";
fos.write(str.getBytes());
fos.close();
}
~~~
## IO異常處理
~~~
public static void main(String[] args) {
File file = new File("c:\\file.txt");
//定義FileOutputStream的引用
FileOutputStream fos = null;
try {
//創建FileOutputStream對象
fos = new FileOutputStream(file);
//寫出數據
fos.write("abcde".getBytes());
} catch (IOException e) {
System.out.println(e.toString() + "----");
} finally {
//一定要判斷fos是否為null,只有不為null時,才可以關閉資源
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
throw new RuntimeException("");
}
}
}
}
~~~
## 字節輸入流InputStream
InputStream此抽象類,是表示字節輸入流的所有類的超類。,定義了字節輸入流的基本共性功能方法

* int read():讀取一個字節并返回,沒有字節返回-1.
* int read(byte[]): 讀取一定量的字節數,并存儲到字節數組中,返回讀取到的字節數
**FileInputStream類**
InputStream有很多子類,其中子類FileInputStream可用來讀取文件內容。
FileInputStream 從文件系統中的某個文件中獲得輸入字節。

**FileInputStream類讀取數據read方法**
在讀取文件中的數據時,調用read方法,實現從文件中讀取數據

* 從文件中讀取數據,代碼演示
~~~
public static void main(String[] args) throws IOException {
String pathName = "/Users/jdxia/Desktop/study/javaStudy/src";
FileInputStream fileInputStream = new FileInputStream(pathName+"/index.txt");
int ch = 0;
while ((ch = fileInputStream.read()) != -1) {
System.out.print((char) ch);
}
//關閉資源
fileInputStream.close();
}
~~~
**讀取數據read(byte[])方法**
在讀取文件中的數據時,調用read方法,每次只能讀取一個,太麻煩了,于是我們可以定義數組作為臨時的存儲容器,這時可以調用重載的read方法,一次可以讀取多個字符。

~~~
public static void main(String[] args) throws IOException {
/*
* 演示第二個讀取方法, read(byte[]);
*/
File file = new File("c:\\file.txt");
// 創建一個字節輸入流對象,必須明確數據源,其實就是創建字節讀取流和數據源相關聯。
FileInputStream fis = new FileInputStream(file);
//創建一個字節數組。
byte[] buf = new byte[1024];//長度可以定義成1024的整數倍。
int len = 0;
while((len=fis.read(buf))!=-1){
System.out.println(new String(buf,0,len));
}
fis.close();
}
~~~
# 復制文件
~~~
public static void main(String[] args) throws IOException {
//1,明確源和目的。
File srcFile = new File("c:\\YesDir\test.JPG");
File destFile = new File("copyTest.JPG");
//2,明確字節流 輸入流和源相關聯,輸出流和目的關聯。
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
//3, 使用輸入流的讀取方法讀取字節,并將字節寫入到目的中。
int ch = 0;
while((ch=fis.read())!=-1){
fos.write(ch);
}
//4,關閉資源。
fos.close();
fis.close();
}
~~~
上述代碼輸入流和輸出流之間是通過ch這個變量進行數據交換的。
上述復制文件有個問題,每次都從源文件讀取一個,然后在寫到指定文件,接著再讀取一個字符,然后再寫一個,一直這樣下去。效率極低。
**緩沖數組方式復制文件**
上述代碼復制文件效率太低了,并且頻繁的從文件讀數據,和寫數據,能不能一次多把文件中多個數據都讀進內容中,然后在一次寫出去,這樣的速度一定會比前面代碼速度快。
~~~
public static void main(String[] args) throws IOException {
File srcFile = new File("c:\\YesDir\test.JPG");
File destFile = new File("copyTest.JPG");
// 明確字節流 輸入流和源相關聯,輸出流和目的關聯。
FileInputStream fis = new FileInputStream(srcFile);
FileOutputStream fos = new FileOutputStream(destFile);
//定義一個緩沖區。
byte[] buf = new byte[1024];
int len = 0;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);// 將數組中的指定長度的數據寫入到輸出流中。
}
// 關閉資源。
fos.close();
fis.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代碼優化