Java IO流
流的概念
Java程序通过流来进行输入/输出。
流是生产或消费信息的抽象。
流通过Java的输入输出系统与物理设备链接。
尽管物理设备不尽相同,但是所有流的行为具有同样的方式。
这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着,一个输入流能够抽象多种类型的输入:从磁盘文件、从键盘或从网络套接字;同样,一个输出流可以输出到:控制台、磁盘文件或相连的网络。处理输入输出不需要代码理解键盘和网络的不同。
Java中流的实现是在java.io包定义的类层次结构内部的。
输入/输出流概念
输入/输出时,数据在通信通道中流动。
所谓“数据流stream”指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据是从一个地方流到另一个地方,这种数据流动的通道都可以称为数据流。
输入/输出是相对于程序来说的,程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。
若程序是数据流的源,即数据的提供者,这个数据流相对于程序来说就是一个“输出数据流”(数据从程序流出);若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)。
输入/输出类
在java.io包中提供了60多个类(流)。
从功能上分为两大类:输入流和输出流。
从流结构上可分为字节流(Byte Streams,以字节为处理单位或称面向字节)和字符流(Character Streams,以字符为处理单位或称面向字符)。
字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现。
字符流是Java 1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer。
在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。
输入流和输出流的处理逻辑
读数据的逻辑为:
open a stream
while more information
read information
close the stream
写数据的逻辑为:
open a stream
while more information
write information
close the stream
另一种流的分类
节点流:从特定的地方读写的流类。例如,磁盘或一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。
与目标相连的一定是节点流。
InputStream
三个基本的读方法:
abstract int read()
抽象方法,所以InputStream是一个抽象类。读取输入流的下一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。
int read(byte[] b)
从输入流读入一些字节数据,把它们放进一个数组b,返回实际读取的字节数,如果返回-1,表示读到了输入流的末尾。
int read(byte[] b, int off, int len)
将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
为什么只有第一个read方法是抽象的,而其余两个read方法都是具体的?
因为第二个read方法依靠第三个read方法来实现,而第三个read方法又依靠第一个read方法来实现。所以说只有第一个read方法是与具体的I/O设备相关的,它需要InputStream的子类来实现。
程序例子:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamTest1
{
public static void main(String[] args) throws IOException
{
InputStream is = new FileInputStream("d:/test.txt");
byte[] buffer = new byte[200];
int length = 0;
while (-1 != (length = is.read(buffer, 0, 200)))
{
// 将字节数组转换成字符串
String str = new String(buffer, 0, length);
System.out.println(str);
}
// 将流所关联到的资源关闭
is.close();
}
}
|
|