• 解析java中的文件字节输入流


    解析java中的文件字节输入流

    1 含义

    字节输入流的后缀为InputStream,文件字节输入流的全名为FileInputStream

    2 作用

    以字节的形式对外部文件(磁盘上的文件,网络文件)进行读取操作,把内容读取到程序中,并在程序中进行相应的操作。

    3 如何用

    3.1 使用方法

    3.1 每次只读取一个字节文件

    3.1.1 核心思路
    a 声明一个文件字节输入流FileInputStream对象,并赋值为null
    b 实例化FileInputStream对象并通过try…catch去处理异常
    c 通过实例对象.read()方法去循环读取(返回值不为-1时就继续读取),读取的时候也需要处理异常
    d 通过强转把ascil的数字转换成对应的字符
    e 最后在finally语句中对实例对象进行非空判断,若不为null则需要通过对象名.close()方法去关闭这个文件字节输入流(不关闭会造成资源的浪费),在关闭的时候也要去try…catch去捕获异常
    3.1.2 示例代码
    temp.txt文件内容
    Hello,Java!!!!
    
    • 1
    FileInputStreamTest类
    package Work03;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class FileInputStreamTest {
        public static void main(String[] args) {
            FileInputStream fis=null;
            try {
                fis=new FileInputStream("src/Work03/temp.txt");
                int readData=0;
                while ((readData=fis.read())!=-1){
                    System.out.print((char)readData);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //需要进行非空判断,才能进行文件字节输入流的关闭
                // 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    3.1.3 示例代码运行截图

    在这里插入图片描述

    3.2 每次以byte数组为长度去进行读取(与byte数组等比例的内容)

    3.2.1 核心思路
    a 声明一个FileInputStream对象并赋值为null;
    b 实例化FileInputStream对象,并需要通过try…catch去捕获异常
    c 创建一个byte数组,用于存放每次去拿数据的最大长度
    d 通过readData=对象名.read(bytes)去进行循环读取(若read方法返回值不为-1,就就可以继续往下读取),这里也要对read方法进行捕获异常
    e 每次打印byte数组里面的值(这里没有剔除之前存放在里面的数据)
    f 判断对象是否为null,若为null,则对象名.close去关闭文件字节输入流;使用close方法我们还是需要去捕获异常
    3.2.2 正确示例代码(内容是byte数组长度倍数)

    temp.txt文件

    Hello,Java!!!!
    //这个文本的字节个数恰好是byte数组长度的整数倍
    
    • 1
    • 2

    FileInputStreamTest文件

    package Work03;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class FileInputStreamTest {
        public static void main(String[] args) {
            FileInputStream fis=null;
            try {
                fis=new FileInputStream("src/Work03/temp.txt");
                byte[] bytes=new byte[2];
                while ((fis.read(bytes))!=-1){
                    System.out.print(new String(bytes));
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //需要进行非空判断,才能进行文件字节输入流的关闭
                // 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
                //非空判断对象名.notnull就会自动生成非空判断语句
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    3.2.3 示例代码运行截图

    在这里插入图片描述

    3.2.4 错误示例代码(内容不是byte数组长度倍数)

    temp.txt文件

    Hello,Java1
    //这个字节的数量不是byte数组长度的整数倍   
    
    • 1
    • 2

    FileInputStreamTest文件

    package Work03;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class FileInputStreamTest {
        public static void main(String[] args) {
            FileInputStream fis=null;
            try {
                fis=new FileInputStream("src/Work03/temp.txt");
                byte[] bytes=new byte[2];
                while ((fis.read(bytes))!=-1){
                    System.out.print(new String(bytes));
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //需要进行非空判断,才能进行文件字节输入流的关闭
                // 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
                //非空判断对象名.notnull就会自动生成非空判断语句
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    3.2.5 错误示例代码运行截图

    在这里插入图片描述

    3.2.6 错误代码分析

    因为你读取到va的时候,byte[0]=118(v对应的asci码值),byte[1]=97,

    然后再往后读取时,发现只有一个新的数据1,此时byte[0]=49,byte[1]保持不变

    你打印是将所有byte数组里面的内容打印了,所以最后两个字符会依次打印成1和a

    因此会得到一些不太符合要求的结构

    因此这种方法用的很少,采用3.3方式用的较多

    3.3 以byte数组读取后,打印有效信息(筛选)

    3.3.1 核心思路
    a 声明一个文件字节输入流对象FileInputStream,并给其赋值为null
    b 实例化文件字节输入流对象,需要try…catch捕获异常
    c.建立一个较大的容量(长度)的byte数组,通过read(bytes)用于一次性获取byte数组长度的元素(数量足够的情况下),若数量不够,把剩下的元素放入byte数组,覆盖上一次的结果,使用read方法的时候需要去捕获异常
    d 把read(bytes)的返回值用一个变量去readLen(新数据/有效数据个数)去接收
    e 然后在通过new String(bytes,0,readLen)筛选得到有效数据(新数据),然后进行循环遍历打印即可
    f.在finally语句中里面判断文件字节输入流对象,若不为空,就需要对象名.close()去进行关闭文件字节输入流这个操作,用close方法还需要去try…catch捕获异常
    3.3.2 示例代码

    temp.txt

    Hello,Java1!Facts speak louder than words
    
    • 1

    FileInputStreamTest类

    package Work03;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    
    public class FileInputStreamTest {
        public static void main(String[] args) {
            FileInputStream fis=null;
            try {
                fis=new FileInputStream("src/Work03/temp.txt");
                byte[] bytes=new byte[1024];
                //这个尽可能的大,是因为可以读取显示的时候尽量让中文不出现乱码问题,而且大的话也可以提高读取效率
                int readLen=0;
                //readLen为:每次read方法读取的有效数据(新数据)的个数
                while ((readLen=fis.read(bytes))!=-1){
                    System.out.print(new String(bytes,0,readLen));
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //需要进行非空判断,才能进行文件字节输入流的关闭
                // 若是空的话,无需去理会她,因为过段时间会被gc垃圾回收器去进行回收的
                //非空判断对象名.notnull就会自动生成非空判断语句
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    3.3.3 示例代码运行截图

    在这里插入图片描述

  • 相关阅读:
    记一个ueditor编辑器的上传包/Core/controller.ashx?action=
    STM CubeMx不能生成代码的解决方法
    ld-linux-armhf.so.3
    2022 年恶意软件趋势与安全最佳实践
    计算机视觉-光源的目的和作用
    链路层3:VLAN的配置与分析
    SQL Server 2012下载和安装配置详细教程手册
    Vitis导入自制IP导致无法构建Platform
    STL常用容器——deque容器的使用
    SpringMVC项目整合SSM统一异常处理
  • 原文地址:https://blog.csdn.net/SSS4362/article/details/126166212