ByteArrayInputStream是把字节数组当成源
的输入流。该类有两个构造方法,每个构
造方法需要一个字节数组提供数据源
– ByteArrayInputStream(byte array[ ])
– ByteArrayInputStream(byte array[ ], int start, int
numBytes)
– 这里,array是输入源。第二个构造方法创建了
一个InputStream类,该类从字节数组的子集生
成,以start指定索引的字符为起点,长度由
numBytes决定
• 下面的例子创建了两个ByteArrayInputStream,用字
母表的字节表示初始化它们
import java.io.*;
class ByteArrayInputStreamDemo {
public static void main(String args[]) throws IOException {
String tmp = "abcdefghijklmnopqrstuvwxyz";
byte b[] = tmp.getBytes();
ByteArrayInputStream input1 = new
ByteArrayInputStream(b);
ByteArrayInputStream input2 = new
ByteArrayInputStream(b, 0, 3);
}
}
input1对象包含整个字母表中小写字母,input2仅包含开始的三个字母。
• 参见程序ByteArrayInputStream1.java
• ByteArrayInputStream实现mark( )和reset( )
方法。然而,如果 mark( )不被调用,reset( )
在流的开始设置流指针——该指针是传递
给构造方法的字节数组的首地址
• 该例先从流中读取每个字符,然后以小写
字母形式打印。然后重新设置流并从头读
起,这次在打印之前先将字母转换成大写
字母
• ByteArrayOutputStream是一个把字节数组当作输
出流的实现。ByteArrayOutputStream 有两个构造
方法
– ByteArrayOutputStream( )
– ByteArrayOutputStream(int numBytes)
– 在第一种形式里,一个32位字节的缓冲区被生成。第
二个构造方法生成一个numBytes大小的缓冲区。缓冲
区保存在ByteArrayOutputStream的受保护的buf 成员里。
缓冲区的大小在需要的情况下会自动增加。缓冲区保
存的字节数是由ByteArrayOutputStream的受保护的
count域保存的
• 参见程序
ByteArrayOutputStream1.java
• 该例用 writeTo( )这一便捷的方法将f 的内容
写入test.txt
– writeTo: 将此字节数组输出流的全部内容写
入到指定的输出流参数中
– reset:的 将此字节数组输出流的 t count 字段重置
为零,从而丢弃输出流中目前已累积的所有输
出。通过重新使用已分配的缓冲区空间,可以
再次使用该输出流
• 对于字节流,缓冲流(buffered stream),
通过把内存缓冲区连到输入/输出流扩展一
个过滤流类。该缓冲区允许Java对多个字节
同时进行输入/输出操作,提高了程序性能。
因为缓冲区可用,所以可以跳过、标记和
重新设置流。缓冲字节流类是
BufferedInputStream 和BufferedOutputStream。
PushbackInputStream 也可实现缓冲流
• 若处理的数据量较多,为避免每个字节的
读写都对流进行,可以使用过滤流类的子
类缓冲流。缓冲流建立一个内部缓冲区,
输入输出数据先读写到缓冲区中进行操作,
这样可以提高文件流的操作效率。
• 缓冲输入/输出是一个非常普通的性能优化。Java
的BufferedInputStream 类允许把任何InputStream
类“包装”成缓冲流并使它的性能提高
• BufferedInputStream 有两个构造方法
– BufferedInputStream(InputStream inputStream)
– BufferedInputStream(InputStream inputStream, int bufSize)
– 第一种形式 创建 BufferedInputStream 流对象并为以后
的使用保存 InputStream 参数 in ,并创建一个内部缓冲
区数组来保存输入数据。
– 第二种形式 用指定的缓冲区大小 size 创建
BufferedInputStream 流对象,并为以后的使用保存
InputStream 参数 in 。
• 缓冲一个输入流同样提供了在可用缓冲区的流内
支持向后移动的必备基础。除了在任何
InputStream类中执行的read( )和skip( )方法外,
BufferedInputStream 同样支持mark( ) 和
reset( )方法。
BufferedInputStream.markSupported( )返回
true是这一支持的体现。
• 当创建缓冲输入流BufferedInputStream时,一个
输入缓冲区数组被创建,来自流的数据填入缓冲
区,一次可填入许多字节
• 参见程序 BufferedInputStream1.java
– public void mark(int readlimit) :在此输入流中
标记当前的位置。对 reset 方法的后续调用会
在最后标记的位置重新定位此流,以便后续读
取重新读取相同的字节
– public void reset() :将此流重新定位到对此输
入流最后调用 mark 方法时的位置
• 缓冲输出流BufferedOutputStream类提供和
FileOutputStream类同样的写操作方法,但所有
输出全部写入缓冲区中。当写满缓冲区或关闭输
出流时,它再一次性输出到流,或者用flush()方
法主动将缓冲区输出到流。
• BufferedOutputStream与任何一个OutputStream相
同,除了用一个另外的flush( ) 方法来保证数据缓
冲区被写入到实际的输出设备。
BufferedOutputStream通过减小系统写数据的时间
而提高性能
• 不像缓冲输入,缓冲输出不提供额外的功
能,Java中输出缓冲区是为了提高性能的。
下面是两个可用的构造方法
– BufferedOutputStream(OutputStream
outputStream)
– BufferedOutputStream(OutputStream
outputStream, int bufSize)
– 第一种形式创建了一个使用512字节缓冲区的缓
冲流。
– 第二种形式,缓冲区的大小由bufSize参数传入。
• 用flush()方法更新流
• 要想在程序结束之前将缓冲区里的数据写
入磁盘,除了填满缓冲区或关闭输出流外,
还可以显式调用flush()方法。flush()方法
的声明为:
– c public d void ) flush() s throws IOException
• 参见程序BufferedOutputStream1.java
– 在调用完BufferedOutputStream后一定要
flush或者将其close掉,否则缓冲区中的字节
不会输出来 |
|