文章目录
在Java8中,InputStream被定义为一个抽象类,相应的,该类下的read()方法也是一个抽象方法,这也就意味着必须有一个类继承InputStream并且实现这个read方法。
查阅Java8 API,我们可以看到,在InputStream中定义了三个重载的read()方法:
但是在这三个方法中,只有参数列表为空的read方法定义为抽象方法,这也就意味着在直接继承自InputStream的所有子类中,必须重写这个方法.
read()
首先我们来看这个没有参数的read方法,从(来源)输入流中(读取的内容)读取数据的下一个字节到(去处)java程序内部中,返回值为0到255的int类型的值,返回值为字符的ASCII值(如a就返回97,n就返回110).如果没有可用的字节,因为已经到达流的末尾, -1返回的值,运行一次只读一个字节,所以经常与while((len = inputstream.read()) != -1)一起使用.
read(byte [] b )
从(来源)输入流中(读取内容)读取的一定数量字节数,并将它们存储到(去处)缓冲区数组b中,返回值为实际读取的字节数,运行一次读取一定的数量的字节数.java会尽可能的读取b个字节,但也有可能读取少于b的字节数.至少读取一个字节第一个字节存储读入元素b[0],下一个b[1],等等。读取的字节数是最多等于b的长度.如果没有可用的字节,因为已经到达流的末尾, -1返回的值 ,如果b.length==0,则返回0.
read( byte [] b , int off , int len)
读取 len字节的数据从输入流到一个字节数组。试图读取多达 len字节,但可能读取到少于len字节。返回实际读取的字节数为整数。 第一个字节存储读入元素b[off],下一个b[off+1],等等。读取的字节数是最多等于len。k被读取的字节数,这些字节将存储在元素通过b[off+k-1]b[off],离开元素通过b[off+len-1]b[off+k]未受影响。read(byte[]b)就是相当于read(byte [] b , 0 , b.length).所以两者差不多.性质一样.
代码示例
package com.yiibai;
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamDemo {
public static void main(String[] args) throws Exception {
InputStream is = null;
byte[] buffer=new byte[5];
char c;
try{
// 文本内容为 ABCDE
is = new FileInputStream("C://test.txt");
// 这个2指的是数据偏移 不是流偏移 将读取的字节添加到字节数组buffer中
is.read(buffer, 2, 3);
// 循环字节数据
for(byte b:buffer){
if(b==0)
// 因为偏移了2个单位,又因为数组默认值为0,所以前面2个单位是没有的
c='-';
else
// 这里是读到的字节
c=(char)b;
System.out.print(c);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if(is!=null)
is.close();
}
}
}
为什么read()无参方法读取一个字节,返回的是一个int类型,而不是一个byte类型?
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,一个字节是8个二进制,也就是说我们实际read完后得到的是这样的东西(11111110,00001010)
,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111(文件的底层按补码来存储的),那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35679.html