JavaIO 3—几个基本的流类介绍(上)

我们这次介绍的是4对输入输出流类,FileOutputStream和FileInputStream、BufferedOutputStream和BufferedInputStream、DataOutputStream和DataInputStream、PipedOutputStream和PipedInputStream。这里我只介绍四组,在上篇文章的继承层次中还有好几个类,读者可以根据Java的帮助文档学习。

上面介绍的这四组输出输入流类都是对应字节流,传递的都是字节。

1 FileOutputStream和FileInputStream

FileOutputStream文件输出流是用于将数据写入FileFileDescriptor 的输出流。创建的时候需要一个File对象或者FileDescriptor(当然还有其他的构成方法,我们不可能一一罗列)。我们可以调用write方法将一个字节数组作为参数,写入到流中。我们传递的字节数组我们也可以指定写入字节的大小。

FileInputStream 从文件系统中的某个文件中获得输入字节。创建的时候需要一个File对象或者FileDescriptor对象。我们可以用read方法将数据读取到我们创建的字节数组中。

这两个流类在使用完了之后我们要记着关闭这个流。下面我们看一个例子:

对于这个两个类都是传输的字节流,我们可以在我们的C盘下看到,生成了一个1.txt文件,我们打开看到是我们输入的值。

这种对于硬盘的读写是我们每次有数据就进行写入,每次需要读取,就去读取硬盘。当然我们知道访问硬盘的速度是比较慢的,频繁的访问硬盘,必定会影响我们程序运行的速度。Java中给我们提供了一种更高效的读写:带缓冲的读写。这就需要介绍我们上面写的第二对类了。

2 BufferedOutputStream和BufferedInputStream

带缓冲的读写,是我们在写文件的时候先将数据写入缓冲区,当缓冲区满的时候,或者我们人为地刷新缓冲区才去访问外存写入硬盘。当然我们读取的时候也是按照这个原理的,这样我们访问硬盘的次数少了,也就提高了我们读写的速度,在数据量比较大的时候,这个是比较高效的。

BufferedOutputStream:该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

BufferedInputStream:BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持markreset 方法的能力。在创建BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次mark 操作后读取的所有字节。

这两个类创建的时候都需要对应的字节流OutputStream或者InputStream类的对象。

下面我们看一个例子程序:

对于这个程序说明几点:我们如果去掉9和10行,我们看到的文件并不会写入到文件,因为缓冲未满人为也没有刷新,所以不会写入。我们加上9行或者10行代码的任何一行都会写入,在我们关闭输出流或者人为刷新的时候都会将数据写入。这里我们分别用FileOutputStream对象fos作为参数创建了BufferedOutputStream对象bos,用FileInputStream对象fis作为参数创建了BufferInputStream对象bis。

如果哪里写错了,请读者指出。

你可能感兴趣的:(JavaIO 3—几个基本的流类介绍(上))