多读书,多做事,广交朋友,趣味丛生
分类: Java
2012-03-18 14:58:03
流是字节序列的抽象概念。
文件是数据的静态存储形式,而流是指数据传输时的形态。
流类分为两个大类:节点流类和过滤流类(也叫处理流类)。
程序用于直接操作目标设备所对应的类叫节点流类,程序也可以通过一个间接流类去调用节点流类,以达到更加灵活方便地读取各种类型的数据,这个间接流类就是过滤流类(也叫处理流类),或者称为包装类。
包装类的调用过程如下图:
流分类的关系
不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类。这个四个类的关系如下:
字节流 | 字符流 | |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
Java内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内 Unicode 字符流之间的转换。而类InputStreamReader 和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
InputStream由于InputStream和OutputStream是abstact类,所以它们还不能表明具体对应哪种IO设备。它们下面有许多子类,包括网络、管道、内存、文件等具体的IO设备,实际程序中使用的它们的各种子类对象。
注:我们将节点流类所对应的IO源和目标称为流节点(Node)。
注意:将A文件的内容写入B文件,程序对A文件的操作所用的是输出类还是输入类这个问题。输入输出类是相对程序而言的,而不是代表文件的,所以我们应该创建一个输入类来完成对A文件的操作,创建一个输出类来完成对B文件的操作。
OutputStream
以 Unicode 字符为导向的 stream ,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。同样,Reader/Writer也为abstact类。
Reader
Writer
IO程序代码的复用
平时写代码用-1来作为键盘输入的结束,在写的函数中不直接使用System.in,只是在调用该函数时,将System.in作为参数传递进去,这样,我们以后要从某个文件中读取数据,来代替手工键盘输入时,我们可以直接使用这个函数,程序就不用做太多的修改了,达到以不变应万变的效果。
字节流和字符流的相互转换
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
InputStreamReader类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。
使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。
InputStreamReader的read()方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。
为了达到更高效率,考虑用BufferedReader封装InputStreamReader,
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
IO中的高级应用:字符集的编码Unicode编码
Unicode(统一码、万国码、单一码、标准万国码)是计算机科学领域里的一项业界标准,用以统一地体现和处理世界上大部分的文字系统,并为其编码。
Unicode备受认可,并广泛地应用于电脑软件的国际化与本地化过程。有很多新科技,如可扩展置标语言、Java编程语言,以及现代的操作系统,都采用Unicode编码。
Unicode是为了解决传统的字符编码方式的局限而产生的,例如ISO8859所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都具有一个共同的问题,即其容许电脑进行双语环境式的处理(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境式的处理(指可同时处理混合多种语言的情况)。
UTF-8UTF是 UnicodeTranslation Format,即把Unicode转做某种格式的意思。
UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)。
UTF-16UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16却无法兼容于ASCII编码。c#中默认的就是UTF-16,所以在处理c#字符串的时候只能是byte,stream等方式去处理。
-------------------------------------------------------------------------------
Data Sink Stream:
Sink Type | Character Streams | Byte Streams |
---|---|---|
Memory | CharArrayReader, CharArrayWriter |
ByteArrayInputStream, ByteArrayOutputStream |
StringReader, StringWriter |
StringBufferInputStream | |
Pipe | PipedReader, PipedWriter |
PipedInputStream, PipedOutputStream |
File | FileReader, FileWriter |
FileInputStream, FileOutputStream |
Processing Streams:
Process | CharacterStreams | Byte Streams |
---|---|---|
Buffering | BufferedReader, BufferedWriter |
BufferedInputStream, BufferedOutputStream |
Filtering | FilterReader, FilterWriter |
FilterInputStream, FilterOutputStream |
Converting between Bytes and Characters |
InputStreamReader, OutputStreamWriter |
|
Concatenation | SequenceInputStream | |
Object Serialization | ObjectInputStream, ObjectOutputStream | |
Data Conversion | DataInputStream, DataOutputStream | |
Counting | LineNumberReader | LineNumberInputStream |
Peeking Ahead | PushbackReader | PushbackInputStream |
Printing | PrintWriter | PrintStream |