-
字符流文件
鎖定
- 中文名
- 字符流文件
- 外文名
- Character stream file
- 學 科
- 軟件工程
- 定 義
- 讀寫文件時採用字符流的方法
- 原 因
- 字符不只是一個字節
- 領 域
- 計算機編程
字符流文件方法簡介
文件是指由創建者所定義的、具有文件名的一組相關元素的集合,可分為有結構文件和無結構文件兩種。在有結構的文件中,文件由若干個相關記錄組成;而無結構文件則被看成是一個字符流。
[2]
字符流文件屬於無結構文件,是讀寫文件時採用字符流的方法。主要原因語言不只有英語一種,還有很多其他語言,如中文,德語。為了全世界每個不同語言的不同字符都統一編碼,全球通行,字符采用了Unicode,每個字符兩個字節。字符流是在字節流的基礎按照字符編碼處理的。
字符流文件有關術語
Unicode
Unicode(中文:萬國碼、國際碼、統一碼、單一碼)是計算機科學領域裏的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。
Unicode伴隨着通用字符集的標準而發展,同時也以書本的形式對外發表
[3]
。Unicode至今仍在不斷增修,每個新版本都加入更多新的字符。目前最新的版本為2016年6月21日公佈的9.0.0
[4]
,已經收入超過十萬個字符(第十萬個字符在2005年獲採納)。Unicode涵蓋的數據除了視覺上的字形、編碼方法、標準的字符編碼外,還包含了字符特性,如大小寫字母。
Unicode發展由非營利機構統一碼聯盟負責,該機構致力於讓Unicode方案取代既有的字符編碼方案。因為既有的方案往往空間非常有限,亦不適用於多語環境。
Unicode備受認可,並廣泛地應用於電腦軟件的國際化與本地化過程。有很多新科技,如可擴展置標語言(Extensible Markup Language,簡稱:XML)、Java編程語言以及現代的操作系統,都採用Unicode編碼。
統一碼的編碼方式與ISO 10646的通用字符集概念相對應。目前實際應用的統一碼版本對應於UCS-2,使用16位的編碼空間。也就是每個字符佔用2個字節。這樣理論上一共最多可以表示216(即65536)個字符。基本滿足各種語言的使用。實際上當前版本的統一碼並未完全使用這16位編碼,而是保留了大量空間以作為特殊使用或將來擴展。
上述16位統一碼字符構成基本多文種平面。最新(但未實際廣泛使用)的統一碼版本定義了16個輔助平面,兩者合起來至少需要佔據21位的編碼空間,比3字節略少。但事實上輔助平面字符仍然佔用4字節編碼空間,與UCS-4保持一致。未來版本會擴充到ISO 10646-1實現級別3,即涵蓋UCS-4的所有字符。UCS-4是一個更大的尚未填充完全的31位字符集,加上恆為0的首位,共需佔據32位,即4字節。理論上最多能表示231個字符,完全可以涵蓋一切語言所用的符號。
基本多文種平面的字符的編碼為U+hhhh,其中每個h代表一個十六進制數字,與UCS-2編碼完全相同。而其對應的4字節UCS-4編碼後兩個字節一致,前兩個字節則所有位均為0。
字節流
在計算機科學裏面,字節流(byte stream)是一種比特流,不過裏面的比特被打包成一個個我們叫做字節(Bytes)的單位。
在電腦網絡內,八比特字串流(octet stream)有時會拿來代表同樣的東西;這種措辭強調了我們的字節是8比特的字節,或者説八比特(octets)。最早字節這個詞被引進的時候,本身並沒有一個大小的標準;不過大多數現在的電腦字節都等同於八位元。
正式的説,一個字節流是一種特定的特定的抽象化,一個讓實體(entity)可以傳輸一系列的字節給處在另一端實體的一種通信頻道。一般來説這種頻道會是雙向,不過有時有單向的。在幾乎所有的狀況,這裏的頻道都具有所謂可靠的特質;也就是,在另一端會按照正確的順序出現應該出現的字節(現實生活中有些頻道,有時會順序錯誤,有時會多出或者失去一些字節)。
比較不正式的説,我們可以把它想做是兩個實體之間的管線(conduit);其中一個實體會將字節輸入管線,另一個實體則接收這些字節。這個管線可以是短暫或者永久的。
字符流文件有關函數
在Java中,字節流繼承於InputStream 和OutputStream;字符流繼承於InputStreamReader OutputStreamWriter。字符流使用了緩衝區 (buffer),而字節流沒有使用緩衝區底層設備永遠只接受字節數據字符是字節通過不同的編碼的包裝,字符向字節轉換時,要注意編碼的問題。字符的處理,一次處理一個字符,字符的底層仍然是基本的字節序列。InputStreamReader 完成byte流解析為char流,按照編碼解析;OutputStreamWriter 提供char流到byte流,按照編碼處理。
基本實現
/*outstream*/ import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; public class Test17 { public static void main(String[] args) throws IOException { File f = new File("d:" + File.separator+"test.txt"); Writer out=new FileWriter(f,true);//追加 String str="\r\nHello World"; out.write(str); out.close(); } } /*inputstream*/ import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class Test18 { public static void main(String[] args) throws IOException { File f = new File("d:" + File.separator+"test.txt"); Reader input=new FileReader(f); char[] c=new char[1024]; int len=input.read(c); input.close(); System.out.println(new String(c,0,len)); } }
- 參考資料
-
- 1. Cay S.Horstmann.Java 核心技術:機械工業出版社,2016
- 2. 湯子瀛.計算機操作系統:西安電子科技大學出版社,2010
- 3. The Unicode Standard 第五版. Addison-Wesley Professional. ISBN 0321480910.
- 4. Unicode® 9.0.0 .unicode.org[引用日期2017-06-11]