JAVA输入输出流--字节流篇(什么时候用哪个)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1流的概念
stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样,如下图:
在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型:
(1)字节流
表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。
(2)字符流
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。
区别:
Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode 字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。
但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。实际上是通过byte[]和String来关联。在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,只是在操作时的导向不同。
如 CharArrayReader和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串;而字节流处理单元为1个字节,操作字节和字节数组,可用于任何类型的对象,包括二进制对象,但是不能直接处理Unicode字符。字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好。如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。
2流的层次结构
java将读取数据对象称为输入流,能向其写入的对象叫输出流。
1)基于字节的输入流
●FileInputStream:把一个文件作为InputStream,从本地文件系统中
读取数据字节,实现对文件的读取操作
●ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使
用,从内存数组中读取数据字节
●ObjectInputStream:对象输入流。从文件中把对象读出来重新建立。
对象必须要实现Serializable接口。对象中的transient和static类型
的成员变量不会被读取和写入。
●PipedInputStream:实现了pipe的概念,从线程管道中读取数据字节,
主要在线程中使用。管道输入流是指一个通讯管道的接收端。一个线程
通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这
样可实现两个线程间的通讯
●SequenceInputStream:把多个InputStream合并为一个
InputStream,当到达流的末尾时从一个流转到另一个流,“序列输入
流”类允许应用程序把几个输入流连续地合并起来,并且使它们像单个输
入流一样出现。
●StringBufferInputStream:把一个String对象作为InputStream,
从字符串中读取数据字节
●FilterInputStream:过滤器流java.io.FilterInputStream,过滤器流
即能把基本流包裹起来,提供更多方便的用法。类的构造方法为
FilterInputStream(InputStream),在指定的输入流之上,创建一个
输入流过滤器。常用的子类如下:
◆BufferedInputStream:缓冲区对数据的访问,以提高效率
◆DataInputStream:从输入流中读取基本数据类型,如int、float、
double或者甚至一行文本
◆LineNumberInputStream:在翻译行结束符的基础上,维护一个
计数器,该计数器表明正在读取的是哪一行。
◆PushbackInputStream:允许把数据字节向后推到流的首部
●System.in
从用户控制台读取数据字节
在System类中, in是InputStream类的静态对象,因此,out和err 可以引用PrintStream类的成员方法。如:System.in.read()。
2)基于字节的输出流
●FileOutputStream:把信息存入文件中
●ByteArrayOutputStream:把信息存入内存中的一个缓冲区中,该类实
现一个以字节数组形式写入数据的输出流
●PipedOutputStream:实现了pipe的概念,主要在线程中使用。管道
输出流是指一个通讯管道的发送端。一个线程通过管道输出流发送数
据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的
通讯。
●SequenceOutputStream:把多个OutStream合并为一个
OutStream
●FilterOutputStream:类似于FilterInputStream,OutputStream也
提供了过滤器输出流。
●ObjectOutputStream:对象输出流。对象必须要实现Serializable接
口。对象中的transient和static类型的成员变量不会被读取和写入。
●System.out
输出数据字节到用户控制台
在System类中,out和err是PrintStream类的静态对象,因此,out 和err可以引用PrintStream类的成员方法。如:System.out.write (int
a)。
3)基于字符的输入流