想要查看此教程的目录请点击:Java IO教程目录贴地址
Java IO Stream是一个你既可以读也可以写的数据流。正如本教程前面提到的,Stream经常被连接到数据源或数据目的地,例如文件,网络连接等等。
Stream在读取或写入数据时,没有像数组那样的下标的概念。你不可以在一个Stream中像数组(或RandomAccessFile读取文件)一样,前或向后移动。Stream只是一个连续不断的数据流。
一些流的实现,比如PushbackInputStream,允许你把不需要的数据回退到流中,稍后可进行重新读取。但是你只可以回退一小部分的数据,并且不能像数组那样随意的遍历数据。数据只能有序的读取。
Java IO流通常基于字节或字符。基于字节的流一般叫做"stream",例如InputStream,OutputStream等。这些流每次读写一个字节,除了DataInputStream和DataOutputStream以外,这两个流一次可以读写int,long, float和double等类型的值。
基于字符的流一般叫做"Reader"或"Writer"。字符流可以读写字符(例如Latin1或UNICODE的字符)。看Java IO: Readers and Writers
章节可以看更多关于字符流的信息。
InputStream
java.io.InputStream是所有Java IO输入流(input stream)的基类。如果你想写一个需要从输入流读取数据的组件,可以尝试让我们的组件依赖于一个InputStream,而不是它的子类(比如FileInputStream),这么做可以让你的代码可以处理所有的InputStream,而不是具体的某一个子类。
但是依赖于InputStream并不总是可行的。如果你需要让数据回退到流,你应该去依赖PushbackInputStream,这意味着你的流参数是这个类型的。否则你无法调用PushbackInputStream的unread()方法。
从InputStream经常会调用read()方法。read()方法返回一个int数值,为读取的字节的值。如果所有的数据已经读完,就会返回-1。
下面为示例:
InputStream input = new FileInputStream("c:\\data\\input-file.txt");
int data = input.read();
while(data != -1){
data = input.read();
}
OutputStream
java.io.OutputStream是所有Java IO输出流的基类。如果你想写一个写出到流的组件,应该确认组件是依赖于OutputStream而不是他的任何子类。
下面的简单示例为将一些数据写入到文件:
OutputStream output = new FileOutputStream("c:\\data\\output-file.txt");
output.write("Hello World".getBytes());
output.close();
将流结合起来
你可以把多各流结合起来成一条链,这样可能实现更高级的操作。比如说,一次从文件读一个字节比较慢。更快的做法是一次从磁盘读取更大的一块儿数据,然后再遍历这个数据块以获得每个字节。要实现缓冲区你可以用BufferedInputStream包装你的输入流,这里有一个示例:
InputStream input = new BufferedInputStream(
new FileInputStream("c:\\data\\input-file.txt"));
...
缓冲区也可以应用到OutputStream,从而分批的写入数据到磁盘(或者目标流)。这也提供了更快的输出。这可以用BufferedOutputStream
缓冲区只是组合流的效果之一。你也可以用PushbackStream包装你的InputStream。这也你可以把数据回退到stream以晚一些重读。这有时候在解析过程中很方便。或者,用SequenceInputStream的时候你可以合并两个InputStream到一个。
通过将输出流和输入流组合到一起,还可以实现一些其他的效果。你可以写你自己的stream相关类去包装Java自带的stream类。这样你就可以创建你自己的过滤器或一些效果。