解析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!!!!
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();
                }
            }
        }
    }
}

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数组长度的整数倍

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();
                }
            }
        }
    }
}

3.2.3 示例代码运行截图

在这里插入图片描述

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

temp.txt文件

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

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();
                }
            }
        }
    }
}

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

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();
                }
            }
        }
    }
}

3.3.3 示例代码运行截图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SSS4362

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

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

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

打赏作者

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

抵扣说明:

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

余额充值