package com.Day19.StudyTest;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo2 {
/**
* 字节输入流读取时有三种方法
* 1.单个字节一个一个读入,创建输入流对象--->用这个对象的方法.read()去获取读入的值,
* 因为这个方法读到的数据返回值是字节的ASCII码,所以用一个int接收然后转换成char
* 类型再输出就可以看到我们熟悉的英文字母了
* 2.按照字节数组读入,同样首先是要创建输入流对象--->然后new一个大小为1024的buffer数组,
* 这里为什么要用这个方法呢?为什么要用数组呢?在没有看过源码和理解底层工作机制的情况下,
* 我个人理解为:单个字节读入时一个个排队读入非常慢,此时我们搞个数组一次性读1024个字节进来,
* 存放这1024个字节的区域称为缓冲区,有了这个缓冲区,我(程序)不用等你们这些小必宰治磨磨唧唧了,
* 我(程序)每次从缓冲区把这1024个字节数据一起读,所以速度就会快很多,这也是用字节数组方法读入的好处吧
* 注意:这里再用read()方法时写做read(buffer,off:0,len)的方式
* 返回值仍是读取到的字节总数
* buffer是把读到的字节要存进去的缓冲区
* off是起始偏移量
* len是可以人为设置的读取的最大字节数
*
*
* */
public static void main(String[] args) throws IOException {
//第一个方法比较简单就不写了
//创建输入流对象
FileInputStream fileInputStream = new FileInputStream("D:\\test.txt");
//创建缓冲区数组
byte[] buffer = new byte[1204];
//开始用while循环来读取
int len = 0;
//读到为空了read()方法就会返回 -1,不管是里面根本就没有字节所以读到为空也好还是读到末尾空了也好,只要是空就返回-1,所以while循环里面设置的不等于-1就可以一直循环,读到-1也就是末尾就跳出
//前面我们设置了数组长度为1024,但是能读到这么多吗我们谁也不知道
//没有读到--->len = -1
//读到了就返回实际个数给len
//最多能读到1024个
while ((len = fileInputStream.read(buffer)) != -1){ //这里理解为fileInputStream对象调用read方法把读到的数据存到buffer数组,同时这个方法返回的是int型的一共读取到的字节总数
//我很蒙蔽这里的len到底输出的是什么
System.out.println(len);
//好了,开始打印test.txt里面的数据
System.out.println(new String(buffer,0,len));
}
//有借有还,再借不难,一定要保持用完就关闭的好习惯哦
fileInputStream.close();
}
}