Java IO(二): InputStream


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() 方法。

  1. int read(byte[])
  2. 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 循环中,对读取的数据进行处理,最后再次将数据写入到字节数组中。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值