程序中的输入流输出流
FileInputStream,FileOutputStream这都不是包装类,不能包别的类的。
7.3.1 理解流的概念
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
我们将IO流类分为两个大类,节点流类和过滤流类(也叫处理流类)。程序用于直接操作目标设备所对应的类叫节点流类,程序也可以通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是过滤流类(也叫处理流类),我更喜欢称之为包装类。不管叫什么,都只是一个代名词而已,读者不要太在意,你可以根据自己的习惯和喜好来定。
7.3.2 InputStream与OutputStream
程序可以从中连续读取字节的对象叫输入流,用InputStream类完成,程序能向其中连续写入字节的对象叫输出流,用OutputStream类完成。InputStream与OutputStream对象是两个抽象类,还不能表明具体对应哪种IO设备。它们下面有许多子类,包括网络、管道、内存、文件等具体的IO设备,如FileInputStream类对应的就是文件输入流,是一个节点流类,我们将这些节点流类所对应的IO源和目标称为流节点(Node)。
指点迷津:
很多人搞不清程序要将A文件的内容写入B文件中,程序对A文件的操作所用的是输出类还是输入类这个问题。读者也先自己想想,再记住下面的话,输入输出类是相对程序而言的,而不是代表文件的,所以我们应该创建一个输入类来完成对A文件的操作,创建一个输出类来完成对B文件的操作。
。。。。。。。。。。。。。
。。。。。。。。。。。。。。
在前面的部分,我们接触到了许多节点流类,就以FileOutputStream和FileInputStream为例吧,这两个类只提供了读写字节的方法,我们通过它们只能往文件中写入字节或从文件中读取字节。在实际应用中,我们要往文件中写入或读取各种类型的数据,我们就必须先将其他类型的数据转换成字节数组后写入文件或是将从文件中读取到的字节数组转换成其他类型,这给我们的程序带来了一些困难和麻烦。如果有人给我们提供了一个中间类,这个中间类提供了读写各种类型的数据的各种方法,当我们需要写入其他类型的数据时,只要调用中间类中的对应的方法即可,在这个中间类的方法内部,它将其他数据类型转换成字节数组,然后调用底层的节点流类将这个字节数组写入目标设备。我们将这个中间类叫做过滤流类或处理流类,也叫包装类,如IO包中有一个叫DataOutputStream的包装类,
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
使用输出包装类的过程,就好比我们要给某个市长送礼,该市长向来不接受陌生人的礼品,但其夫人则是来者不拒的。我们只要将礼品送到市长夫人手中,就等于送到了市长的手中。市长夫人就是我们用到的输出包装类。
使用输入包装类过程,好比我们要想借用市长大人的一点权力,承揽一个假竞标的工程项目,我们是没法直接请动市长大人来替我们说话的,但我们可以让市长公子来替我们办好这件事,我们就间接借用了市长的权力。市长公子就是我们用到的输入包装类。
我们还可以用包装类去包装另外一个包装类,创建包装类对象时,必须指定它要调用的那个底层流对象,也就是这些包装类的构造函数中,都必须接收另外一个流对象作为参数。如DataOutputStream包装类的构造函数为:
public DataOutputStream(OutputStream out)
7.3.1 理解流的概念
数据流是一串连续不断的数据的集合,就象水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流。数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。不管写入时是将数据分多次写入,还是作为一个整体一次写入,读取时的效果都是完全一样的。
我们将IO流类分为两个大类,节点流类和过滤流类(也叫处理流类)。程序用于直接操作目标设备所对应的类叫节点流类,程序也可以通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是过滤流类(也叫处理流类),我更喜欢称之为包装类。不管叫什么,都只是一个代名词而已,读者不要太在意,你可以根据自己的习惯和喜好来定。
7.3.2 InputStream与OutputStream
程序可以从中连续读取字节的对象叫输入流,用InputStream类完成,程序能向其中连续写入字节的对象叫输出流,用OutputStream类完成。InputStream与OutputStream对象是两个抽象类,还不能表明具体对应哪种IO设备。它们下面有许多子类,包括网络、管道、内存、文件等具体的IO设备,如FileInputStream类对应的就是文件输入流,是一个节点流类,我们将这些节点流类所对应的IO源和目标称为流节点(Node)。
指点迷津:
很多人搞不清程序要将A文件的内容写入B文件中,程序对A文件的操作所用的是输出类还是输入类这个问题。读者也先自己想想,再记住下面的话,输入输出类是相对程序而言的,而不是代表文件的,所以我们应该创建一个输入类来完成对A文件的操作,创建一个输出类来完成对B文件的操作。
。。。。。。。。。。。。。
。。。。。。。。。。。。。。
在前面的部分,我们接触到了许多节点流类,就以FileOutputStream和FileInputStream为例吧,这两个类只提供了读写字节的方法,我们通过它们只能往文件中写入字节或从文件中读取字节。在实际应用中,我们要往文件中写入或读取各种类型的数据,我们就必须先将其他类型的数据转换成字节数组后写入文件或是将从文件中读取到的字节数组转换成其他类型,这给我们的程序带来了一些困难和麻烦。如果有人给我们提供了一个中间类,这个中间类提供了读写各种类型的数据的各种方法,当我们需要写入其他类型的数据时,只要调用中间类中的对应的方法即可,在这个中间类的方法内部,它将其他数据类型转换成字节数组,然后调用底层的节点流类将这个字节数组写入目标设备。我们将这个中间类叫做过滤流类或处理流类,也叫包装类,如IO包中有一个叫DataOutputStream的包装类,
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
使用输出包装类的过程,就好比我们要给某个市长送礼,该市长向来不接受陌生人的礼品,但其夫人则是来者不拒的。我们只要将礼品送到市长夫人手中,就等于送到了市长的手中。市长夫人就是我们用到的输出包装类。
使用输入包装类过程,好比我们要想借用市长大人的一点权力,承揽一个假竞标的工程项目,我们是没法直接请动市长大人来替我们说话的,但我们可以让市长公子来替我们办好这件事,我们就间接借用了市长的权力。市长公子就是我们用到的输入包装类。
我们还可以用包装类去包装另外一个包装类,创建包装类对象时,必须指定它要调用的那个底层流对象,也就是这些包装类的构造函数中,都必须接收另外一个流对象作为参数。如DataOutputStream包装类的构造函数为:
public DataOutputStream(OutputStream out)