package com.javase.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* java.io.FileInputStream:
* 1.是文件字节输入流,万能的,任何类型的文件都可以采用这个流来读。
* 2.以字节的方式完成读的操作(硬盘---->内存)
*/
public class FileInputStreamText01 {
public static void main(String[] args) {
//创建文件字节输入流对象
//文件路径:D:\测试.txt
FileInputStream fis = null;
try {
fis = new FileInputStream("D:\\测试.txt");
/*
//开始读 (这种方法一次只读一个字节效率低)
int readData = 0;
while ((readData = fis.read()) != -1) {
readData = fis.read();
System.out.print(readData);
}
*/
/*
//为了提高效率,我们可以一次读取一个数组长度的字节
//创建一个byte[]数组,该数组的长度自定义,本段代码是测试用,所有定义的很小
byte[] bytes = new byte[5];
while (true){
//该方法是往byte[]数组中读,一次最多读取的字节数量是bytes.length,这个方法的返回值是读取的字节数量,该方法
//一个字节都没读取到的时候返回值是-1。
int readCount = fis.read(bytes);
if (readCount == -1){ //当某次读取什么都没读到,循环结束
break; //结束循环
}
//把读到的字节转换成字符串输出,读到多少转多少,
//new String(bytes,0,readCount)这个方法就是把byte[]数组转换成字符串
System.out.print(new String(bytes,0,readCount));
}
*/
//继续对上面效率已经提高了的代码进行改进(下面这种写法是需要大家掌握的)
//创建一个byte[]数组
byte[] bytes = new byte[5];
//给定一个int变量并赋值为0;
int readCount = 0;
//分析一下下行代码的执行
//第一步:执行"="右边的代码 fis.read(bytes) 用来读取文件,它执行结果是int类型,表示读取到了多少字节.
//第二步:将上一步的int类型的返回值赋值给变量readCount.
//第三步:判断readCount是否不等于-1,该步的返回值是boolean类型,如果读到了字节,这里的结果就是true;
//如果没有读到字节,返回值就是false,下面循环就结束了
while ((readCount = fis.read(bytes)) != -1){
System.out.print(new String(bytes,0,readCount));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {//在finally语句块中确保流一定会关闭
if (fis != null) {//判断fis(流)是不是空,不是空确保关闭,是空没必要关闭
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}