Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)

目录

文件字节输入流:每次读取多个字节

实例演示

注意事项

文件字节输入流:一次读取完全部字节

方式一

方式二

注意事项


文件字节输入流:每次读取多个字节

用到之前介绍过的常用方法:

实例演示

需求:用每次读取多个字节的方法读出File文件的内容

java 复制代码
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception {
        //1.创建一个字节输入流对象代表字节输入流管道与源文件接通。
        InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");

        //2.开始读取文件中的字节数据:每次读取多个字节。
        //public int read(byte b[]) throws IoException
        //每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1
        byte[] buffer = new byte[3];
        int len = is.read(buffer);
        String rs = new String(buffer);
        System.out.println(rs);
        System.out.println("当前读取的字节数量:" + len);

        //目标文件有5个字节,需要再读取一次
        //注意:读取多少,倒出多少
        int len2 = is.read(buffer);
        String rs2 = new String(buffer,0,len2);
        System.out.println(rs2);
        System.out.println("当前读取的字节数量:" + len2);

        int len3 = is.read(buffer);
        System.out.println(len3);   //-1

        is.close(); //关闭流
    }
}

运行结果:

使用循环改造一下

java 复制代码
package user.IOTestOne;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception {
        //1.创建一个字节输入流对象代表字节输入流管道与源文件接通。
        InputStream is = new FileInputStream("HelloWorld\\src\\file.txt");

        //使用循环
        byte[] buffer = new byte[3];
        int len;    //记住每次读取了多少个字节
        while((len = is.read(buffer)) != -1){
            //注意:读取多少,倒出多少
            String rs = new String(buffer,0,len);
            System.out.println(rs);
        }
        //性能得到了明显的提升
        //但是这种方案也不能避免读取汉字输出乱码的问题
        is.close(); //关闭流
    }
}

运行结果:

注意事项

  • 使用FilelnputStream每次读取多个字节,读取性能得到了提升,但读取汉字输出还是会乱码。

使用字节流读取中文,如何保证输出不乱码,怎么解决?

  • 定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。

文件字节输入流:一次读取完全部字节

方式一

自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。

方法名称 说明
public int read(byte\[\] buffer) 每次用一个字节数组去读取,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1.

注意:文件存于硬盘中,硬盘的大小是极大的,文件的大小也可能会很大;但是我们定义的数组实际上存储于内存中,内存是很小的,无法给数组定义很大的长度;因此,这个方法只适合读取不那么大的文件。

选取案例还是那个File文件

java 复制代码
package user.IOTestOne;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileInputStreamTest3 {
    public static void main(String[] args) throws Exception{
        //1.创建一个字节输入流管道与源文件接通
        InputStream is = new FileInputStream("HelloWorld/src/file.txt");

        //2.准备一个字节数组,大小与文件的大小正好一样大。
        File f = new File("HelloWorld/src/file.txt");
        long size = f.length();
        byte[] buffer = new byte[(int) size];

        int len = is.read(buffer);
        System.out.println(new String(buffer));

        System.out.println("文件大小:" + size + "字节");
        System.out.println(len);

        is.close();
    }
}

运行结果:

方式二

  • Java官方为lnputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。
方法名称 说明
public byte\[\] readAllBytes()throws IOException 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
java 复制代码
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class FileInputStreamTest3 {
    public static void main(String[] args) throws Exception{
        //1.创建一个字节输入流管道与源文件接通
        InputStream is = new FileInputStream("HelloWorld/src/file.txt");

        byte[] buffer = is.readAllBytes();  //JDK8 之后新增的方法
        System.out.println(new String(buffer));

        is.close();
    }
}

运行结果:

注意事项

直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?

  • 如果文件过大,创建的字节数组也会过大,可能引起内存溢出。

其实,读写文本内容本适合用字符流

字节流适合做数据的转移,如:文件复制等。

下篇就开始介绍字符流。


END


学习自:黑马程序员------Java课程

相关推荐
许彰午4 小时前
14_Java泛型完全指南
java·windows·python
lengxuemo4 小时前
ICC2学习笔记之Placement and Optimization
笔记·学习
温柔只给梦中人4 小时前
NLP学习:注意力机制
人工智能·学习·自然语言处理
智慧物业老杨4 小时前
司法绿色通道下的物业纠纷数智化解决方案——基于“三优先“机制的全流程技术落地实践
java·django
2601_961194024 小时前
2026初级会计实务公式总结大全|计算题公式手册PDF
java·spring·eclipse·pdf·tomcat·hibernate
做个文艺程序员5 小时前
第1篇:K8s 核心概念精讲:Pod、Deployment、Service 与 Namespace——Java 开发者快速上手指南
java·云原生·容器·kubernetes·容器编排
sheeta19985 小时前
LeetCode 每日一题笔记 日期:2026.06.02 题目:3635. 最早完成陆地和水上游乐设施的时间 II
笔记·算法·leetcode
逐影者3976 小时前
ch592f学习
学习
小满Autumn6 小时前
MVVM Light 架构笔记:定位器、命令、消息与 IoC 实践
笔记·学习·架构·c#·上位机·mvvm
蓝黑墨水6 小时前
动画角色的整个流程
学习