Java基礎-IO流對象之字符類(FileWrite與FileReader)

           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
yinzhengjie.txt 文本內容
 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 }
相關文章
相關標籤/搜索