字元流檔案

字元流檔案

在Java API中,可以從其中讀入一個位元組序列的對象稱之輸入流,而可以向其中寫入一個位元組序列的對象稱做輸出流。位元組流就是普通的二進制流,讀出來的是bit,而位元組流不便於處理Unicode形式存儲的信息。字元流就是在位元組流的基礎按照字元編碼處理,處理的是char。字元流檔案是指讀寫檔案時採用字元流的方法。

基本介紹

  • 中文名:字元流檔案
  • 外文名:Character stream file
  • 學科:軟體工程
  • 定義:讀寫檔案時採用字元流的方法
  • 原因:字元不只是一個位元組
  • 領域:計算機編程
簡介,有關術語,Unicode,位元組流,字元流檔案的有關函式,

簡介

檔案是指由創建者所定義的、具有檔案名稱的一組相關元素的集合,可分為有結構檔案和無結構檔案兩種。在有結構的檔案中,檔案由若干個相關記錄組成;而無結構檔案則被看成是一個字元流。字元流檔案屬於無結構檔案,是讀寫檔案時採用字元流的方法。主要原因語言不只有英語一種,還有很多其他語言,如中文,德語。為了全世界每個不同語言的不同字元都統一編碼,全球通行,字元採用了Unicode,每個字元兩個位元組。字元流是在位元組流的基礎按照字元編碼處理的。

有關術語

Unicode

Unicode(中文:萬國碼、國際碼、統一碼、單一碼)是計算機科學領域裡的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。
Unicode伴隨著通用字元集的標準而發展,同時也以書本的形式對外發表。Unicode至今仍在不斷增修,每個新版本都加入更多新的字元。目前最新的版本為2016年6月21日公布的9.0.0,已經收入超過十萬個字元(第十萬個字元在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));    } }

相關詞條

熱門詞條

聯絡我們