IO 输入与输出(3) -- 节点流之五ByteArrayInputStream和ByteArrayOutputStream类

   

    内存虚拟文件和内存映象文件其实就是把内存中的一块数据存储缓冲区虚拟成一个文件,原来该写入硬盘上的内容可以被写到内存中,原来该从硬盘中读取的内容也可以从内存中读取。要在程序中定义一个大的程序缓冲区,这个缓冲区通常就是一个字节数组。在Java中定义了两个专门的类,ByteArrayInputStream类和ByteArrayOutputStream类,用于以IO流的方式来完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存映像文件的功能。

 

ByteArrayInputStream类有两个默认的构造函数:

ByteArrayInputStream(byte[] b): 使用一个字节数组当中所有的数据做为数据源,程序可以像输入流方式一样读取字节,可以看做一个虚拟的文件,用文件的方式去读取它里面的数据。

ByteArrayInputStream(byte[] b,int offset,int length): 从数组当中的第offset开始,一直取出length个这个字节做为数据源。

 

ByteArrayOutputStream类也有两个默认的构造函数:

ByteArrayOutputStream(): 创建一个32个字节的缓冲区

ByteArrayOutputStream(int): 根据参数指定大小创建缓冲区

这两个构造函数创建的缓冲区大小在数据过多的时候都会自动增长,如果创建缓冲区以后,程序就可以把它像虚拟文件一样似的往它里面写入内容,当写完内容以后调用ByteArrayOutputStream()的方法就可以把其中的内容当作字节数组返回。

 

通过这两个类可以实现诸如屏幕共享软件的程序。

 

下面来看个例子:编写一个把输入流中的所有英文字母变成大写字母,然后将结果写入到一个输出流对象。用这个函数来将一个字符串中的所有字符转换成大写。

 

ByteArrayTest.java

 

一个字符串其实就相当于一个字符数据的存储缓冲区,JDK中还提供了StringReaderStringWriter类来以字符IO流的形式处理字符串,这两个类分别对应ByteArrayInputStream类和ByteArrayOutputStream类。

 

在编写与IO流相关的程序代码时,一定要考虑好程序代码的可复用性,可以从下面几个方面考虑:

 

1.       System.in是连接到键盘的,它是InputStream类型的实例对象,System.out是连接到显示器,是PrintStream类的实例对象。程序可以使用System.in来读取键盘上的数据,可以使用System.out来将数据输出到显示器上,键盘被当作一个特殊的输入文件,显示器被当作一个特殊的输出文件处理

 

2.       无论是文件流还是网络流,它都有一个结束标记来表示底层物理设备中的数据的中止点,不管底层物理设备用什么样的方式来实现数据的终止点,InputStream类的read()总是返回-1来表示输入流的结束。

 

3.       Windows下,按下Ctrl+Z组合键可以产生键盘输入流的结束标记,而在Linux下则是是Ctrl+D

 

上面的例子中:transform(System.in,System.out);就用于从键盘接收数据,并转换输出到命令行。

 

建议:如果要编写从键盘上连续读取一大段数据的时候,应该尽量将读取数据的过程放在函数中完成,并且使用-1作为键盘输入的结束点,在函数中编写的程序代码不应直接使用System.in来读取数据,而是用一个InputStream类型的形式参数对象来读取数据,然后将System.in作为实参来传递给InputStream类型的形式参数来调用该函数。

 

版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章