Java基礎-IO流對象之字符類(FileWrite與FileReader)
html
做者:尹正傑
java
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。數組
一.常見編碼簡介ide
1>ASCII編碼
咱們知道計算機是由外國人發明的,他們當時也沒有考慮到全球都用到計算機,所以在設計編碼的時候壓根就沒有考慮中文,日文,泰文等等,而是僅僅將英文大小寫和標點符號等一些特殊字符考慮進去了,這種編碼格式被稱爲ASCII編碼,每一個字母或特殊字符都會用8個「0」和「1」的二進制組合進行標識,聰明的小夥伴估計口算都能算出來2的八次方是多少了,沒錯是256個,也就是說用8個連續的「0」或者「1「是沒有辦法表示全部國家的語言的。由於它最大上限就是256個字符存儲。好比咱們要保存一個大寫的字母」A「就須要一個字節,用二進制表示則爲:「0100 0001」spa
2>.gb2312和gbk操作系統
這種編碼格式就是爲了解決ASCII沒法存儲漢字的狀況而誕生的,也就是說gb2312能夠存儲咱們的漢字,而gbk只是對gb2312的一個補充,它主要補充了中國的繁體字。這兩種編碼格式均可以存儲ASCII的全部字符且能夠存儲全部的中國字符,也就是說你開發了一箇中國人的遊戲,若是你將這遊戲放在日本,泰國等國家的電腦上安裝的話可能沒法運行,由於他們的電腦安裝的操做系統也是他們的母語喲。gb2312和gbk編碼在存儲漢字上要比utf8要好的多,由於utf8在存儲一個漢字的時候須要3個字節(即24位)進行存儲,而gbk只須要2個字節就能夠搞定,佔用空間較少。設計
3>.萬國碼code
可是隨着計算機的快速發展,其餘國家也有需求存入相應國家的文字(如中國出現了gbk編碼,日本出現了Shift_JIS編碼,韓國出現了Euc-kr編碼等等。),所以又出現了一種可以存儲各個國家的編碼,咱們稱之爲「萬國碼」(即Unicode),支持大多數個國家的語言文字。它有一個下限要求,就是美國字符都必須用最少16位(兩個字節)來進行存儲,也就是說要用連續的16個」0「和」1「的二進制數字來表示一個字符,沒錯,這種編碼格式可以保存全部的ASCII的字符,只不過以前用一個字節存取的ASCII編碼,如今要用兩個字節進行存取。好比存取一個大寫的「A」,用二進制表示則爲:」000000000100 0001「,很明顯,浪費了空間。原本用8位就能夠存儲的如今卻用了16位來進行存儲。而存儲一個普通的中國漢字只須要用3個字節來存取,也就是24位來進行存儲,即連續的24個「0」或者「1」來進行存儲。甚至若是出現更復雜的文字可能須要用4到5個字節來進行存儲。htm
4>.UTF8
咱們剛剛也提到萬國碼的確是不錯的,由於它能存幾乎全部國家的語言和文字,可是缺陷就是對每一個字符的存儲空間最小必須是2個字節,這在存儲一些簡單的字符很明顯就是浪費空間呢,因而又興起了另一種編碼UTF-8,咱們稱之爲可變長字符編碼。它其實是對萬國碼的一種壓縮,可以用最少的位數表示一個字符(每一個字符表示最少是8位,即一個字節)。換句話說,一個英文字符就用一個字節來表示(按照以前ASCII的方式來存取),而存儲漢字仍是按照萬國碼的方式進行存儲,即3個字節表示一個漢字。
5>.推薦使用的編碼格式
咱們知道編碼格式有不少種,雖然gbk存儲漢字要比utf8要節省空間,可是咱們仍是推薦使用utf8編碼格式,緣由有三:
第一,gbk並無包含其它國家的文字;
第二,不少開源軟件使用的都是外國人開發的,他們大多數都是使用utf8編碼格式;
第三,Python3.x解釋器默認使用utf-8方式進行編碼和解碼(固然你也能夠指定編碼格式);
想要了解更多編碼的知識請參考:http://www.cnblogs.com/yinzhengjie/p/7518172.html
二.字符輸出流寫文本FileWriter類
java.io.Writer是寫入字符流的抽象類,換句話說,它是全部字符輸出流的超類。
做用:將內存中的字符寫入到文本中。這裏演示的是它經常使用的子類對象,即FileWriter。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileWriter; 10 import java.io.IOException; 11 12 public class WriterDemo { 13 public static void main(String[] args) throws IOException { 14 FileWriter fw = new FileWriter("yinzhengjie.txt"); 15 //寫入字符串 16 fw.write("尹正傑"); 17 //將內存中的數據刷新到文件中 18 fw.flush(); 19 //寫入一個字符串數組 20 char[] buf = {'a','b','c','d','e'}; 21 fw.write(buf); 22 //寫入一個字符串數組的一部分 23 fw.write(buf, 1, 3); 24 //寫入一個字符 25 fw.write(97); 26 //釋放資源,其實在釋放資源時會默認調用flush方法。 27 fw.close(); 28 } 29 }
三.字符輸入流讀取文本FileReader類
java.io.Reader是字符輸入流讀取文本文件的抽象類,它也是全部字符輸入流的超類。
做用:專門讀取文本文件 ,咱們這裏演示的是FileReader。
尹正傑abcdebcda
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileReader; 10 import java.io.IOException; 11 12 public class ReaderDemo { 13 public static void main(String[] args) throws IOException { 14 FileReader fr = new FileReader("yinzhengjie.txt"); 15 /* 16 //按照單個字符讀取 17 int len; 18 while((len = fr.read()) != -1) { 19 System.out.print((char)len); 20 } 21 fr.close(); 22 */ 23 24 //按照字節數組的方式讀取 25 char[] buf = new char[4096]; 26 int len = 0; 27 while((len = fr.read(buf)) != -1) { 28 System.out.println(new String(buf,0,len)); 29 } 30 31 } 32 } 33 34 /* 35 以上代碼執行結果以下: 36 尹正傑abcdebcda 37 */
四.字符流複製文本文件
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note5; 8 9 import java.io.FileReader; 10 import java.io.FileWriter; 11 import java.io.IOException; 12 13 public class CopyFile { 14 public static void main(String[] args) { 15 FileReader fr = null; 16 FileWriter fw = null; 17 18 try { 19 fr = new FileReader("yinzhengjie.txt"); 20 fw = new FileWriter("yinzhengjie.backup"); 21 22 char[] buf = new char[4096]; 23 int len ; 24 while(( len = fr.read(buf)) != -1 ) { 25 fw.write(buf, 0, len); 26 fw.flush(); 27 } 28 } catch (Exception e) { 29 throw new RuntimeException("複製失敗!"); 30 }finally { 31 try { 32 if(fw != null) { 33 fw.close(); 34 } 35 }catch(IOException e) { 36 throw new RuntimeException("釋放資源失敗!"); 37 }finally { 38 try { 39 if(fr != null) { 40 fr.close(); 41 } 42 }catch(IOException e) { 43 throw new RuntimeException("釋放資源失敗!"); 44 } 45 } 46 } 47 } 48 }