Java中的FileInputStream字节流类读取文件

本文深入探讨Java中FileInputStream的三种读取方法:read()、read(byte[])和read(byte[],int,int)。通过实例验证文件指针移动及返回值规律,解析不同用法下方法的行为,帮助读者掌握FileInputStream的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学了这么长时间的Java,发现对其IO的操作还是不熟悉,特地记录一下,以备日后复习。就从FileInputStream开始吧,今天只简单的介绍其读取方法,这个方法看似简单,里面还是有很多知识点值得去挖一下的。

read方法一共有三种重载方式

  • int read()
  • int read(byte b[])
  • int read(byte b[], int off, int len)

这三种重载方式都符合一下两条结论:

  • read方法每读一次就会使文件指针向后移动一个字节或者N个字节(N=读取到的数组字节数<=指定的字节数组长度)
  • 如果文件指针到文件末尾,就返回-1

首先验证验证上面两条结论

public class Test05 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("test.txt");
        fos.write("hello".getBytes());  //向文件中写入5个字节(英文一个字母,包含英文的特殊字符都是只占一个字节)
        fos.close();

        FileInputStream fis = new FileInputStream("test.txt");
        int b = fis.read();  //①
        System.out.println("read = " + b);
        int readLen = fis.read(new byte[5]);  //②
        System.out.println("read1 = " + readLen);
        int readLen2 = fis.read(new byte[5], 0, 2);  //③
        System.out.println("read2 = " + readLen2);
    }
}

在这里插入图片描述
①处返回的是读取到的字节值,只读取了1个字节
②处想要把5个字节全部读取出来,但却之读取到了4个字节,因为经过①处的代码,文件指针向后移动了一个字节,所以只剩下了4个字节
③处还想读取5个字节,不好意思,这时文件指针已经移动到了最后,没有字节可供你读取了,所以就直接返回-1
(调整三处代码的顺序以及指定的字节数组大小,可以更好的理解)

下面三个函数的结论首先包含上面两个结论

read()

这个很简单,结论就是

  • 返回读到的字节值

read(byte b[])

int readLen = fis.read(new byte[10]);
System.out.println("readLen = " + readLen);

在这里插入图片描述
可以看到,我们指定了一个长度为10的字节数组,但是读取到字节长度只有5个,得出结论:

  • 返回的就是读取到的数据字节文件长度,与给定的byte数组长度无关

int read(byte b[], int off, int len)

这个重载函数只是在上面的基础上,添加了两个参数
第一个off:就是offset,指的是在b中的起始位置
第二个len:从off开始向后的长度

int readLen = fis.read(new byte[5], 2, 3);
System.out.println("readLen = " + readLen);

在这里插入图片描述

结论是:

  • 返回给定的len的长度

正常用法,这个方法有以下两个注意点:

  • off<=b.len-1
  • len<=b.len-off

不正常用法,就是这个方法有个BUG
首先看一下源码中关于off的描述
在这里插入图片描述
注意,源码已经明确说明了,off是在b数组中的起始位置

int read2 = fis.read(new byte[5], 5, 0);  //按理来说,off<b.len,但是它这样依然不报错
System.out.println("read2 = " + read2);

在这里插入图片描述
只不过返回值为0而已。
记住正确用法吧,先。找了半天更底层的源码也没找到原因。


看看下面的代码的执行结果的差别,想想为什么?
第一个
int len = 0;
byte[] bytes = new byte[4];
while ((len=fis.read(bytes))!=-1){
    System.out.println(new String(bytes, 0, len));  //读取到的字节长度
}

结果
在这里插入图片描述

第二个
int len = 0;
byte[] bytes = new byte[4];
while ((len=fis.read(bytes))!=-1){
    System.out.println(new String(bytes, 0, bytes.length));  //指定的字节数组长度
}

结果
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值