[TOC]
# 字符流
當我們操作的文件中有中文字符,并且需要對中文字符做出處理時怎么辦呢?
## 字符編碼表
我們知道計算機底層數據存儲的都是二進制數據,而我們生活中的各種各樣的數據,如何才能和計算機中存儲的二進制數據對應起來呢?
這時老美他們就把每一個字符和一個整數對應起來,就形成了一張編碼表,老美他們的編碼表就是ASCII表。其中就是各種英文字符對應的編碼。
編碼表:其實就是生活中字符和計算機二進制的對應關系表。
1、ascii: 一個字節中的7位就可以表示。對應的字節都是正數。0-xxxxxxx
2、iso-8859-1:拉丁碼表 latin,用了一個字節用的8位。1-xxxxxxx 負數。
3、GB2312:簡體中文碼表。包含6000-7000中文和符號。用兩個字節表示。兩個字節第一個字節是負數,第二個字節可能是正數
GBK:目前最常用的中文碼表,2萬的中文和符號。用兩個字節表示,其中的一部分文字,第一個字節開頭是1,第二字節開頭是0
GB18030:最新的中文碼表,目前還沒有正式使用。
1、unicode:國際標準碼表:無論是什么文字,都用兩個字節存儲。
* Java中的char類型用的就是這個碼表。char c = 'a';占兩個字節。
* Java中的字符串是按照系統默認碼表來解析的。簡體中文版 字符串默認的碼表是GBK。
5、UTF-8:基于unicode,一個字節就可以存儲數據,不要用兩個字節存儲,而且這個碼表更加的標準化,在每一個字節頭加入了編碼信息(后期到api中查找)。
能識別中文的碼表:GBK、UTF-8;正因為識別中文碼表不唯一,涉及到了編碼解碼問題。
對于我們開發而言;常見的編碼 GBK UTF-8 ISO-8859-1
文字--->(數字) :編碼。 “abc”.getBytes() byte[]
(數字)--->文字 : 解碼。 byte[] b={97,98,99} new String(b)
# 字符輸入流Reader
們讀取擁有中文的文件時,使用的字節流在讀取,那么我們讀取到的都是一個一個字節。只要把這些字節去查閱對應的編碼表,就能夠得到與之對應的字符。API中是否給我們已經提供了讀取相應字符的功能流對象,Reader,讀取字符流的抽象超類。

* read():讀取單個字符并返回
* read(char[]):將數據讀取到數組中,并返回讀取的個數。
## FileReader類
查閱FileInputStream的API,發現FileInputStream 用于讀取諸如圖像數據之類的原始字節流。要讀取字符流,請考慮使用 FileReader。
打開FileReader的API介紹。用來讀取字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是適當的
* 構造方法

**FileReader讀取包含中文的文件**
~~~
public static void main(String[] args) throws IOException {
//給文件中寫中文
writeCNText();
//讀取文件中的中文
readCNText();
}
//讀取中文
public static void readCNText() throws IOException {
FileReader fr = new FileReader("D:\\test\\cn.txt");
int ch = 0;
while((ch = fr.read())!=-1){
//輸出的字符對應的編碼值
System.out.println(ch);
//輸出字符本身
System.out.println((char)ch);
}
}
//寫中文
public static void writeCNText() throws IOException {
FileOutputStream fos = new FileOutputStream("D:\\test\\cn.txt");
fos.write("java".getBytes());
fos.close();
}
~~~
# 字符輸出流Writer
Writer是寫入字符流的抽象類。其中描述了相應的寫的動作。

## FileWriter類
查閱FileOutputStream的API,發現FileOutputStream 用于寫入諸如圖像數據之類的原始字節的流。要寫入字符流,請考慮使用 FileWriter。
打開FileWriter的API介紹。用來寫入字符文件的便捷類。此類的構造方法假定默認字符編碼和默認字節緩沖區大小都是可接受的。
* 構造方法

**FileWriter寫入中文到文件中**
寫入字符到文件中,先進行流的刷新,再進行流的關閉。
~~~
public class FileWriterDemo {
public static void main(String[] args) throws IOException {
//演示FileWriter 用于操作文件的便捷類。
FileWriter fw = new FileWriter("d:\\text\\fw.txt");
fw.write("你好謝謝再見");//這些文字都要先編碼。都寫入到了流的緩沖區中。
fw.flush();
fw.close();
}
}
~~~
**flush()和close()的區別**

flush():將流中的緩沖區緩沖的數據刷新到目的地中,刷新后,流還可以繼續使用。
close():關閉資源,但在關閉前會將緩沖區中的數據先刷新到目的地,否則丟失數據,然后在關閉流。流不可以使用。如果寫入數據多,一定要一邊寫一邊刷新,最后一次可以不刷新,由close完成刷新并關閉。
# 復制文本文件
~~~
public class CopyTextFileTest {
public static void main(String[] args) throws IOException {
copyTextFile();
}
public static void copyTextFile() throws IOException {
//1,明確源和目的。
FileReader fr = new FileReader("c:\\cn.txt");
FileWriter fw = new FileWriter("c:\\copy.txt");
//2,為了提高效率。自定義緩沖區數組。字符數組。
char[] buf = new char[1024];
int len = 0;
while((len=fr.read(buf))!=-1){
fw.write(buf,0,len);
}
/*2,循環讀寫操作。效率低。
int ch = 0;
while((ch=fr.read())!=-1){
fw.write(ch);
}
*/
//3,關閉資源。
fw.close();
fr.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代碼優化