欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于FileInputStream文件字节输入流的使用

程序员文章站 2022-07-10 20:58:11
关于FileInputStream字节输入流:FileInputStream,称为字节输入流,属于万能流,一次读一个字节byte,什么文件都能读。也称为Read(读),从硬盘 到 内存输入数据。测试代码:import java.io.*;public class Test02 { public static void main(String[] args) { // 创建字节输入流对象 FileInputStream fis = null;...

关于FileInputStream文件字节输入流:

FileInputStream,称为文件字节输入流,属于万能流,一次读一个字节byte,什么文件都能读。
也称为Read(读),从硬盘 到 内存输入文件数据。

测试代码:

import java.io.*;

public class Test02 {
    public static void main(String[] args) {

        // 创建文件字节输入流对象
        FileInputStream fis = null;

        // 流操作会抛出异常,属于编译时异常,需要我们预先处理,main方法中的异常通常进行捕捉,不要上抛异常
        try {
            // F:\JavaCode\JavaSE\IOtest\test02.txt,文件地址,这种地址属于绝对路径
            // 文本内容:abc
            fis = new FileInputStream("F:\\JavaCode\\JavaSE\\IOtest\\test02.txt");  // 注意写2个\\,2个\\表示1个\
            //fis = new FileInputStream("F:/JavaCode/JavaSE/IOtest/test02.txt");  // 也可以写这种/,这种/没有转义的意思

            // 开始Read(读)
            /*
            int readData = fis.read();  // 返回的是第一个字节的ASCII编码值
            System.out.println(readData);  // 97    读的是'a'的字节

            // 再读下一个字节
            readData = fis.read();
            System.out.println(readData);  //98    读b

            // 再读下一个字节
            readData = fis.read();
            System.out.println(readData);  //99    读c

            // 再读下一个字节
            readData = fis.read();  // 当没有数据时,read()方法返回-1
            System.out.println(readData);  //-1
            */

            // 以上读的操作也可以用循环控制
            int readData = 0;
            while ((readData = fis.read()) != -1) {
                System.out.print(readData + "   ");  // 97   98   99
            }
            System.out.println();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {  // finally语句块中的代码一定会执行,确保流用完后关闭
            if (fis != null) {  // 只有fis不为空的时候,才需要关闭通道
                try {
                    fis.close();  // close()方法会抛出编译时异常,继续try..catch
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

对FileInputStream的read()方法的熟悉:

如果使用read()每次都只能读一个字节,这样的话硬盘和内存之间交互太频繁,浪费时间。

可以考虑使用read(byte[] b)方法,一次最多读取b.length个字节。方法返回值是实际读取到的字节数量。

注意:是最多读取到b.length个字节,当读取到文件末尾时,有可能不够b.length个。
如果文件读取完了,再次读取就会返回-1了。

测试代码:

import java.io.*;

public class Test03 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            // 使用相对路径,IOtest\test03.txt,是当前文件下的
            // 注意:IDEA中的当前路径是project工程这个根文件
            fis = new FileInputStream("IOtest\\test03.txt");

            // 先提醒一下文本内容为:abcdef
            // 创建byte[]数组
            byte[] bytes = new byte[4];  // 指定一次最多读取4个字节

            // 第一次读取
            /*
            int readCount = fis.read(bytes);
            System.out.println(readCount);  // 4
            String strData = new String(bytes, 0, readCount);  // 将读取到的bytes数组转换成字符串
            System.out.println(strData);  //abcd

            // 第二次读取
            readCount = fis.read(bytes);
            System.out.println(readCount);  // 2
            strData = new String(bytes, 0, readCount);
            System.out.println(strData);  //ef

            // 第三次读取
            readCount = fis.read(bytes);
            System.out.println(readCount);  // -1   表示已经读取完了
            */

            // 以上读取应该用循环控制
            int readCount = 0;
            while ((readCount = fis.read(bytes)) != -1) {
                System.out.print(new String(bytes, 0, readCount));  // abcdef
            }
            System.out.println();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

关于FileInputStream类的常用方法:

(1)public FileInputStream(String name);
构造方法,创建文件输入流对象,连接到指定文件名。

(1)int read();
一次读取一个字节,返回改字节的ASCII码值。文件读完后返回-1.

(2)int read(byte[] b);
一次最多读取b.length个字节,返回实际读取字节的数量。文件读完后返回-1。

(3)void close();
关闭当前流的所有管道,释放资源。

所有流用完之后,一定记得关闭,释放资源。
通常close()方法放在finally语句块当中,来确保流用完后会关闭。

(4)int available();
返回流当中剩余的没有读取的字节数量。文件读完后返回0。

当文件不大时,可以一次性读完文件。

byte[] bytes = new byte[fis.available()];  // 直接创建对应大小的byte[]数组
int readeCount = fis.read(bytes);
System.out.println(new String(bytes, 0, readCount));  // 如果是文本文件,可以自接打印查看

(5)long skip(long n);
跳过n个字节不读取。

有的文件可能有固定的格式,可以跳过这些不必要的字节数,来达到提高读取的效率。

本文地址:https://blog.csdn.net/pipizhen_/article/details/107486607