InputStream 类是 Java IO API 中所有输入流的基类。InputStream 子类包括了 FileInputStream、BufferInputStream、PushbackInputStream 等等。
Java InputStream 例子
InputStream 用于读取基于字节的数据,一次读取一个字节,这是一个 InputStream的例子。
InputStream input = new FileInputStream("文件地址");
int data = input.read();
while(data != -1){
// do something with data
data = input.read();
}
这个例子创建了 FileInputStream 实例。FileInputStream 是 InputStream 的子类,所以可以把 FileInputstream 实例赋值给 InputStream 变量。
注意:为了清晰,代码忽略了一些必要的异常处理。
从 Java7 开始,你可以使用 try-with-resource 结构确保 InputStream 在结束使用之后关闭。这是一个简单地例子。
try(InputStream input = new FileInputStream("file.txt")){
int data = input.read();
while(data != -1){
System.out.print((char) data);
data = input.read();
}
}
当执行线程退出 try 语句块时候,InputStream 变量会被关闭。
read()
read() 方法返回从 InputStream 流内读取一个字节的内容
int data = input.read();
你可以把返回的 int 类型转化为 char 类型
char aChar = (char) datal;
InputStream 的子类可能会包含 read() 的替代方法。比如,DataInputStream 允许你利用 readBoolean(),readDouble() 等方法读取 Java 基本类型 int,long,float,doubule,boolean。
流末尾
如果 read() 方法返回 -1,意味着程序已经读到了流末尾,此时流内没有多余的数据可供读取,-1是一个 int 类型,不是 byte 或者 char 类型,这是不一样的。当读到流末尾,你就可以关闭流了。
read(byte[])
InputStream 包含了2个从 InputStream 中读取数据存储到缓冲数组中的 read() 方法。
- int read(byte[])
- int read(byte, int offset, int length)
一次性读取一个字节数组,比一次性读取一个字节的方式快的多,所以尽可能使用这两个方法代替 read() 方法。
read(byte[]) 方法尝试读取与定字节数组容量一样大的字节数,返回值说明了已经读取过得字节数,如果 InputStream 内可读的数据不足以填满字节数组,那么数组剩余的部分将包含本次读取之前数组的值。记得检查有多少数据写入到字节数组中。
read(byte, int offset, int length) 方法同样将数据读取到字节数组中,不同的是,该方法从数组的 offset 位置开始,并且最多将 length 个字节写入到数组中。同样的,read(byte, int offset, length) 方法返回一个 int 变量。告诉你已经有多少字节写入已经被写入到字节数组中,所以请记得在读取数据前检查上一次调用 read(byte, int offset, int length)
这两个方法都会在读取到流末尾时返回 -1。
InputStream 示例
InputStream input = new FileInputStream("源文件");
byte [] data = new byte[1024];
int byteRead = input.read(data);
while(byteRead != -1){
// do something with data
byteRead = input.read(data);
}
input.close();
代码中首先创建了一个字节数组,然后声明了一个叫做 byteRead 的存储每次调用 read(byte[]) 返回值都是 int 变量,并且将第一次调用的 read(byte[]) 得到的返回值赋值给它。
在 while 循环中,对读取的数据进行处理,最后再次将数据写入到字节数组中。