104-字节输入流一次读取多个字节的方法

本文讲解了Java中如何使用FileInputStream的read方法一次性读取1024字节,并通过String(byte[])构造方法将字节数组转换为字符串,以提高文件读取效率。重点阐述了字节数组的作用和read方法的返回值含义。
摘要由CSDN通过智能技术生成
字节输入流一次读取多个字节的方法
int read(byte[] b)
len记录的是有效字节个数
明确两件事情:
1.方法的参数byte[]  byte数组的作用?
缓冲作用,存储每次读取到的多个字节
数组长度一般定义为1024(1KB 或者1024的整数倍)
2.方法的返回值int又是什么
记录的是有效字节个数

String类的构造方法:
String(byte[] bytes):把字节数组转换为字符串
String(byte[] bytes,int offset,int length);把字节数组的一部分转换为字符串 offset是数组的开始索引 length是转换的字节个数
package demo02;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

/*
字节输入流一次读取多个字节的方法
int read(byte[] b)
明确两件事情:
1.方法的参数byte[]  byte数组的作用?
缓冲作用,存储每次读取到的多个字节
数组长度一般定义为1024(1KB 或者1024的整数倍)
2.方法的返回值int又是什么
记录的是有效字节个数

String类的构造方法
String(byte[] bytes):把字节数组转换为字符串
String(byte[] bytes,int offset,int length);把字节数组的一部分转换为字符串 offset是数组的开始索引 length是转换的字节个数

 */
public class Demo02InputStream {
    public static void main(String[] args) throws IOException {
        //创建FileInputStream对象,构造方法中确定要读取的数据源
        FileInputStream fis = new FileInputStream("D:\\IdeaProjects\\新建文件夹\\c.txt"/*C.TXT内部ABCDE*/);
        //使用FileInputStream对象中的方法read读取文件
      /*  byte[] bytes = new byte[2];
        int len = fis.read(bytes);
        System.out.println(len);//2
        System.out.println(Arrays.toString(bytes));//[65,66]
        System.out.println(new String(bytes)); //AB

        len = fis.read(bytes);
        System.out.println(len);//2  int read(byte[] b)方法返回值2是每次读取字节的个数
        System.out.println(new String(bytes)); //CD  注意:这里是CD因为read指针

        len = fis.read(bytes);
        System.out.println(len);//1  int read(byte[] b)方法返回值2是每次读取字节的个数
        System.out.println(new String(bytes)); //ED

        len = fis.read(bytes);
        System.out.println(len);//-1  int read(byte[] b)方法返回值2是每次读取字节的个数
        System.out.println(new String(bytes)); //ED*/

      /*
      发现以上读取时是一个重复的过程,可以使用循环优化 不知道文件中有
       */
       byte[] bytes = new byte[1024];//byte数组存储读到的多个字节
        int len =0; //记录每次读取的有效字节个数
        while((len=fis.read(bytes))!=-1){
     //System.out.println(new String(bytes)); //ABCDE后面有很多空格因为1024位嘛,所以可以使用第二种构造方法来只转有效的
            System.out.println(new String(bytes,0,5));//ABCDE
        }
        //释放资源
        fis.close();
    }
}

注意看打印的内容

原理: 

右边一次读取(输入到内存中不就是读取嘛)多个字节 :

1.硬盘中 ABCDE 结束标志

2.new FileInputStream创建流对象指向文件

3.创建数组byte[] 长度是2  初始值默认是0

4.读取数据用fis.read(bytes);(过程read()->jvm->os->操作系统方法读取数字)这个方法返回值是int(读取数据的个数)

5.第一次读取  指针指向A 数组还有个位置所以又读了B

6.len记录的是有效字节个数

7.第三次读取 len=1 指针指向E 为什么是ED呢 因为是E把C在数组中覆盖了

 第四次读取,指针已经在结束标志,没有读到数据返回-1(结束标志返回给os os给jvm jvm给我们返回-1,说明读到结束标志了)

8.数组:起到缓冲作用,存储读取到的多个字节

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值