java io流层次_Java基础进阶——“Java IO流:IO系统类层次关系 ”

流是字节序列的抽象概念。

文件是数据的静态存储形式,而流是指数据传输时的形态。

流类分为两个大类:节点流类和过滤流类(也叫处理流类)。

程序用于直接操作目标设备所对应的类叫节点流类,程序也可以通过一个间接流类去调用节点流类,以达到更加灵活方便地读取各种类型的数据,这个间接流类就是过滤流类(也叫处理流类),或者称为包装类。

包装类的调用过程如下图:

0_1311342473qkdK.gif

流分类的关系

不管流的分类是多么的丰富和复杂,其根源来自于四个基本的类。这个四个类的关系如下:

字节流

字符流

输入流

InputStream

Reader

输出流

OutputStream

Writer

Java内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和java内 Unicode 字符流之间的转换。而类InputStreamReader 和OutputStreamWriter处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

InputStream

0_13113425479oA7.gif

由于InputStream和OutputStream是abstact类,所以它们还不能表明具体对应哪种IO设备。它们下面有许多子类,包括网络、管道、内存、文件等具体的IO设备,实际程序中使用的它们的各种子类对象。

注:我们将节点流类所对应的IO源和目标称为流节点(Node)。

注意:将A文件的内容写入B文件,程序对A文件的操作所用的是输出类还是输入类这个问题。输入输出类是相对程序而言的,而不是代表文件的,所以我们应该创建一个输入类来完成对A文件的操作,创建一个输出类来完成对B文件的操作。

OutputStream

0_1311342625TfqH.gif

以字符为导向的 stream Reader/Writer

以 Unicode 字符为导向的 stream ,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。同样,Reader/Writer也为abstact类。

Reader

0_1311342706qAV1.gif

Writer

0_13113427528II9.gif

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-8

UTF是 UnicodeTranslation Format,即把Unicode转做某种格式的意思。

UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。用在网页上可以同一页面显示中文简体繁体及其它语言(如日文,韩文)。UTF-16

UTF-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值