首页 百科知识 字符流和对象流

字符流和对象流

时间:2022-04-09 百科知识 版权反馈
【摘要】:12.2.2 字节流、字符流和对象流在Java开发环境中,主要是由java.io包中提供的一系列的类和接口来实现各种常见的输入和输出处理。根据流中传输数据的类型可分为:字节流、字符流和对象流。2.字符流类似地,输入流Reader和输出流Writer是java.io包中最基本的字符流,其他字符流都是Reader或Writer的派生子类。

12.2.2 字节流、字符流和对象流

在Java开发环境中,主要是由java.io包中提供的一系列的类和接口来实现各种常见的输入和输出处理。其中,每一个类代表了一种特定的输入流或输出流。程序员可以创建各种特定的输入输出流对象,并通过这些对象方便地进行数据的输入与输出操作。

根据流中传输数据的类型可分为:字节流、字符流和对象流。

①字节流是以字节为基本处理单位的流。

②字符流是以字符为基本处理单位的流。

③对象流是以对象为基本处理单位的流。为了使对象的状态能够方便地永久保存下来,JDK1.1以后的java.io包中提供了用于对象永久化保存状态的机制,它是在字节流基础上通过实现ObjectInput和ObjectOutput接口完成的。

1.字节流

输入流InputStream和输出流OutputStream是java.io包中最基本的字节流,其他字节流都是InputStream或OutputStream的派生子类。它们的继承关系如下。

·InputStream

InputStream类是抽象类,不能直接使用。它是所有字节输入流类的父类,描述了所有字节输入流的共同方法,用于完成从输入流中读取数据的功能。InputStream类提供了3种从流中读数据的方法。

①int read()throws IOException:从输入流中读一个字节,形成一个0~255的整数返回。它是一个抽象方法,必须在具体的子类中被实现。

②int read(byte b[])throws IOException:从输入流中读多个字节到数组b中。当数组满时或输入流中不再有数据时返回。返回实际读取的字节数。

③int read(byte b[],int off,int len)throws IOException:从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取的字节数。

对于这3个方法,若返回-1,表明流结束。这3个读方法只能把数据以二进制的原始方式读入,而不能分解、重组这些数据,更不能对数据进行变换。

每个流都有一个位置指针,在流刚被创建时,该指针指向流的第一个数据,以后每次读操作都是在当前位置指针处执行。伴随着流操作的执行,位置指针自动后移,指向下一个未被读取的数据。位置指针决定了读方法将在输入流中读取哪个数据。有关位置指针的方法如下。

①long skip(long n)throws IOException:跳过并忽略n个字节,重新定位输入流的当前位置。

②void mark(int limit):在输入流的当前位置作标记。

③void reset()throws IOException:将输入流的读取位置复位到最后一次用mark方法标记的位置。

④boolean markSupported():测试输入流是否支持标记/复位机制。

⑤int available()throws IOException:返回在无阻塞情况下,由当前位置可以从输入流中读入或跳过的字节数。

关闭输入流的方法:void close()throws IOException,关闭输入流并释放与该流相关的系统资源。

OutputStream是抽象类,不能直接使用。它是所有字节输出流类的父类,描述了所有字节输出流的共同方法,用于将数据顺序写入到指定外设上。OutputStream类提供了3种向流中写数据的方法。

①void write(int b)throws IOException:往输出流写出指定字节。它是一个抽象方法,必须在具体的子类中被实现。

②void write(byte[]b)throws IOException:往输出流依次写出字节组b中的所有字节。

③void write(byte[]b,int off,int len)throws IOException:往输出流依次写出字节组b中的从索引off开始的len个字节。

这3个写方法只能将原始数据以二进制的方式,逐字节地写入输出流所连接的外设中,而不能对所传递的数据进行格式化或进行类型转换。其他方法如下。

①void flush()throws IOException:刷新输出流。为了提高性能,有些输出流往往先把数据存放在缓冲区里,然后在合适时再将它们成块地写到数据介质上。

②void close()throws IOException:关闭输出流并释放与该流相关的系统资源。

2.字符流

类似地,输入流Reader和输出流Writer是java.io包中最基本的字符流,其他字符流都是Reader或Writer的派生子类。它们的继承关系如下。

Reader类是抽象类,不能直接使用。它是所有输入字符流类的父类,描述了所有字符输入流都需要的方法,用于完成从输入流中读取数据的功能。Reader类定义了一组与Input- Stream类相似的方法,如read、mark、reset、skip、close等方法。只是这里的信息处理单位是字符,而不是字节。Reader类也提供了如下3种从流中读数据的方法。

①int read()throws IOException:从输入流中读一个字符,并以int型返回。它是一个抽象方法,必须在具体的子类中被实现。

②int read(char[]cbuf)throws IOException:读入若干字符,并存入字符数组cbuf中。

③int read(char[]cbuf,int off,int len)throws IOException:读入len个字符,存入cbuf[off]开始的字符数组元素中。

Writer类是抽象类,不能直接使用。它是所有输出字符流类的父类,描述了所有字符输出流都需要的方法,用于接收顺序输出的字符并将它送入目的地。Writer类定义了一组与OutputStream类相似的方法,如write、flush、close等方法。只是这里的信息处理单位是字符,而不是字节。Writer类提供了如下更多的向流中写数据的方法。

①void write(int c)throws IOException:写出指定字符。

②void write(char[]cbuf)throws IOException:写出字符数组cbuf的所有字符。

③void write(char[]cbuf,int off,int len)throws IOException:写出字符数组cbuf中的部分字符。

④void write(String str)throws IOException:写出字符串str中的所有字符。

⑤void write(String str,int off,int len)throws IOException:写出字符串str中的部分字符。

由于文本文件对字符采用特定的编码,而Java程序对字符采用Unicode编码。所以,Java程序在读写文本文件时,最主要的问题是字符编码的转换。Read类能够将输入流中采用其他编码的字符转换为Unicode字符,存入内存中;Writer类能够把内存中的Unicode字符转换为其他编码的字符,再写到输出流中。

3.对象流

ObjectInputStream和ObjectOutputStream是对象流,提供将整个对象写入到输出流中,并从输入流中读取对象的功能。这两个类分别继承了InputStream和OutputStream,继承关系如下:

注意:通过流传输的对象必须实现序列化的接口,即一个对象只有实现了序列化,它才能通过流来传输。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈