首页 > 代码库 > java io

java io

IO流实现的目标就是从程序外(文件,网路等)读取数据到程序中以及从程序中输出数据到程序外。然而我们经常用到的IO流往往不止于这两个,比如inputstream,outputstream,fileinputstream,fileoutputstream,bufferedinputstream,bufferedoutputstream,writer,reader,printwriter,bufferedreader等等。IO流可以分成两类,一类是字节流(其传输时以二进制形式进行,字节流包括各种stream),一类是字符流(其传输时是以字符的形式进行的,字符流包括各种writer、reader)。在这里,就有一个很重要的知识点——装饰者模式。

 

装饰者模式在Java中经常会用到的一种思想,也体现了java作为面向对象的特性。我们可以这样认为,在IO流中,inputstream和outputstream是父类,其他的包括fileinputstream,fileoutputstream等都是通过继承inputstream和outputstream两个之中的一个然后再扩展出其他功能,比如说bufferedinputstream,这其实也就是在继承inputstream的基础上通过增加一个缓冲区buffer扩展而来的。在这里,我还想用一个简单的例子说明一下装饰者模式,比如说一个学校里有学生和老师,假定说学生的作用就是studying,老师的作用就是teaching,现在我们想要给老师或者学生增加一些功能,比如说学习什么课程,教什么课程,我们就可以定义另外的两个类,分别继承学生类,老师类,然后再这两个类中对他们的作用进行扩展,将其改成studying programming和teaching programming。从这个例子中,我们可以看到fileinputstream正是在inputstream的基础上增加和file相关联的功能,也正是因为这样,fileinputstream在实例化的时候要传入一个file对象。 通过装饰者模式,我们可以学到一种理解和学习IO流中其他流的作用和运用。

 

首先我为大家介绍关于inputstream,outputstream,fileinputstream,fileoutputstream,bufferedinputstream,bufferedoutputstream。 

inputstream和outputstream:这两个相当于两个管道,你可以往inputstream里面的read方法读出数据(read方法返回读出到数据的长度,如果文件里面没有内容,则返回-1.并且可以再read方法中传入一个byte类型的变量接收读取到的数据),也可以使用outputstream的writ方法往outputstream写入数据,这两个方法都是传入byte类型的数据(write方法是void类型,不返回任何值。其需要传入byte类型的数据,可使用string的getbytes方法)。然而,如果我们不把这两个管道连接到source和target上,它们可以说是无意义的,不能被实例化的。

 

fileinputstream和fileoutputstream:顾名思义,这两个类是用来从文档中读出数据到程序(fileinputstream)以及从程序中写入数据到文档(fileoutputstream),因此,在实例化这两个函数的时候,我们需要传入一个file对象,同时fileoutputstream在实例化的过程中传入一个不存在的文件时,系统将会为你自动新建,并且fileoutputstream还可以在file对象的参数后传入一个boolean类型的参数,表示是否从源文件的末尾写入数据,若为true,则数据将写入到源文件的后面,否则,源文件将会被删除后从头开始写入数据。

 

bufferedinputstream和bufferedoutputstream:这两个类是在inputstream和outputstream的基础上增加了一个buffer的缓冲区,从而使数据不直接写入到流中,而是先写入buffer然后再一次性flush到流中,相信对于大多数人来说,不难理解bufferedinputstream和bufferedoutputstream的性能会有很大的提高。bufferedinputstream和bufferedoutputstream可以传入inputstream和outputstream类型的参数,这就意味着fileinputstream和fileoutputstream也可以作为其参数传入,这就相当于用了两层装饰者模式,在fileinputstream和fileoutputstream的基础上又增加了buffer的功能。bufferedoutputstream有多另外一个函数就是flush,也就是把写入的数据从缓冲区中释放到流里面,否则写入的数据将会等到缓冲区满了的时候再释放到流里面。

 

接下来是第二部分, 也是我们在IO编程中很经常使用到的,writer,reader,inputstreamreader,outputstreamwriter,printwriter,bufferedreader。

inputstreamreader和outputstreamwriter是writer和reader与stream之间的桥梁,他们可以把一个stream对象转化成一个reader或者writer对象。因此他们需要传入的对象为inputstream或者outputstream然而却返回一个writer或者reader对象。其方法与writer和reader一致。

因此,writer的write方法能够传入char数组或者string类型的数据,而reader的read方式能返回char类型的长度(若空则返回-1),并可以传入一个char数据做为参数接收读取的数据。

java io