JAVA中IO操作

来源:互联网 发布:淘宝店广告图怎么设置 编辑:程序博客网 时间:2024/05/16 11:35

流的概念

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

IO流的分类

· 根据处理数据类型的不同分为:字符流和字节流

· 根据数据流向不同分为:输入流和输出流

字符流和字节流

字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别:

· 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。

· 处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。

结论:只要是处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。

输入流和输出流

对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。

字节流与字符流主要的区别是他们的的处理方式
字节流是最基本的,所有的InputStreamOutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的
但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化
这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]String来关联
在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的

在从字节流转化为字符流时,实际上就是byte[]转化为String时,
public String(byte bytes[], String charsetName)
有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang
而在字符流转化为字节流时,实际上是String转化为byte[]时,
byte[]    String.getBytes(String charsetName)
也是一样的道理

至于java.io中还出现了许多其他的流,按主要是为了提高性能和使用方便,
BufferedInputStream,PipedInputStream


Java IO流对象

1.输入字节流InputStreamIO中输入字节流的继承图可见上图,可以看出:

1. InputStream 是所有的输入字节流的父类,它是一个抽象类。

2. ByteArrayInputStreamStringBufferInputStreamFileInputStream是三种基本的介质流,它们分别从Byte数组、StringBuffer、和本地文件中读取数据。PipedInputStream是从与其它线程共用的管道中读取数据,与Piped相关的知识后续单独介绍。

3. ObjectInputStream和所有FilterInputStream的子类都是装饰流(装饰器模式的主角)。

 

2.输出字节流OutputStream

IO 中输出字节流的继承图可见上图,可以看出:

1. OutputStream是所有的输出字节流的父类,它是一个抽象类。

2. ByteArrayOutputStreamFileOutputStream是两种基本的介质流,它们分别向Byte数组、和本地文件中写入数据。PipedOutputStream是向与其它线程共用的管道中写入数据,

3. ObjectOutputStream和所有FilterOutputStream的子类都是装饰流。


4.字符输入流Reader

在上面的继承关系图中可以看出:

1. Reader 是所有的输入字符流的父类,它是一个抽象类。

2. CharReaderStringReader是两种基本的介质流,它们分别将Char数组、String中读取数据。PipedReader是从与其它线程共用的管道中读取数据。

3. BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象。

4. FilterReader是所有自定义具体装饰流的父类,其子类PushbackReaderReader对象进行装饰,会增加一个行号。

5. InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream转变为Reader的方法。我们可以从这个类中得到一定的技巧。Reader中各个类的用途和使用方法基本和InputStream中的类使用一致。后面会有ReaderInputStream的对应关系。

 

5.字符输出流Writer

在上面的关系图中可以看出:

1. Writer 是所有的输出字符流的父类,它是一个抽象类。

2. CharArrayWriterStringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据。PipedWriter是向与其它线程共用的管道中写入数据,

3. BufferedWriter是一个装饰器为Writer提供缓冲功能。

4. PrintWriter PrintStream 极其类似,功能和使用也非常相似。

OutputStreamWriter OutputStream Writer转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream极其类似


具体的对象体现:

1. InputStreamReader:字节到字符的桥梁

2. OutputStreamWriter:字符到字节的桥梁



 


 


原创粉丝点击