简介

文件是指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种。在有结构的文件中,文件由若干个相关记录组成;而无结构文件则被看成是一个字符流。2字符流文件属于无结构文件,是读写文件时采用字符流的方法。主要原因语言不只有英语一种,还有很多其他语言,如中文,德语。为了全世界每个不同语言的不同字符都统一编码,全球通行,字符采用了Unicode,每个字符两个字节。字符流是在字节流的基础按照字符编码处理的。

有关术语UnicodeUnicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。

Unicode伴随着通用字符集的标准而发展,同时也以书本的形式对外发表3。Unicode至今仍在不断增修,每个新版本都加入更多新的字符。目前最新的版本为2016年6月21日公布的9.0.04,已经收入超过十万个字符(第十万个字符在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)); } }