JAVA基础(FileInputStream)

本文介绍了JAVA基础中的FileInputStream,详细讲解了它的构造方法,包括通过File对象、字符串路径和FileDescriptor创建流对象。重点阐述了read()方法,解释了为何返回值为int而非byte,以确保能完整读取文件数据,包括读取过程中可能遇到的-1情况。此外,还提及了自定义小数组进行文件读取的可能性。

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

1,FileInputStream介绍

  • FileInputStream流被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作如读取图片视频等

 

2,构造方法

  • FileInputStream(File file)

通过打开与File类对象代表的实际文件的链接来创建FileInputStream流对象, 若File类对象的所代表的文件不存在;不是文件是目录;或者其他原因不能打开的话,则会抛出FileNotFoundException

  • FileInputStream(String name)

通过指定的字符串参数来创建File类对象,而后再与File对象所代表的实际路径建立链接创建FileInputStream流对象

通过查看源码,发现该构造方法等于是在第一个构造方法的基础上进行延伸的,因此规则也和第一个构造方法一致

  • FileInputStream(FileDescriptor fdObj) 几乎不用

该构造方法没有理解---查看api是指使用的fdObj文件描述符来作为参数,文件描述符是指与计算机系统中的文件的连接,前面两个方法的源码中最后都是利用文件描述符来建立连接的

 

 

3,常用方法

【1】public int read() throws IOException

  • 从此输入流中读取一个数据字节。如果没有输入可用,则此方法将阻塞。

  • 下一个数据字节;如果已到达文件末尾,则返回 -1。

public class Demo1_FileInputStream {

    public static void main(String[] args) throws IOException {

         FileInputStream fis = new FileInputStream("xxx.txt");    //创建流对象

        int x = fis.read();                                        //从硬盘上读取一个字节

        System.out.println(x);

        int y = fis.read();

        System.out.println(y);

        int z = fis.read();

        System.out.println(z);

        int a = fis.read();

        System.out.println(a);

        int b = fis.read();

        System.out.println(b);

        fis.close();                                            //关流释放资源

      

    }

}

【2】读取文件中数据,b个字节读一次

   public static void main(String[] args) IOException {

        FileInputStream fis = new FileInputStream("aaa.txt");    //创建一个文件输入流对象,并关联aaa.txt

        int b;                                                    //定义变量,记录每次读到的字节

        while((b = fis.read()) != -1) {                            //将每次读到的字节赋值给b并判断是否是-1

            System.out.println(b);                                //打印每一个字节

        }

        fis.close();                                            //关闭流释放资源

    }
  • read()方法读取的是一个字节,为什么返回是int,而不是byte

因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111

那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上

24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型

      00010100 00100100 01000001 11111111 0000000

     

      10000001    byte类型-1的原码

      11111110    -1的反码

      11111111    -1的补码

     

      00000000 00000000 00000000 11111111

 

 

4,自定义小数组进行读文件


 

public class Demo4_ArrayCopy {





    /**

     * @param args

     * 第三种拷贝

     * 定义小数组

     * @throws IOException

     */

    public static void main(String[] args) throws IOException {

        FileInputStream fis = new FileInputStream("xxx.txt");

        byte[] arr = new byte[2];

        int a = fis.read(arr);                        //将文件上的字节读取到字节数组中

        

        System.out.println(a);                        //读到的有效字节个数

        for (byte b : arr) {                        //第一次获取到文件上的a和b

            System.out.println(b);

        }

        System.out.println("-----------------------");

        int c = fis.read(arr);

        System.out.println(c);

        for (byte b : arr) {

            System.out.println(b);

        }

        fis.close();

    }

}

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兴帅_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值