「深入理解Java I/O: FileInputStream」

举报
bug菌 发表于 2023/10/18 10:57:23 2023/10/18
【摘要】 🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

  在Java应用程序开发中,输入输出(I/O)操作是必不可少的一部分。Java语言的I/O模型基于流(Stream),其中InputStreamOutputStream是两个基本抽象类。这些类使Java程序员可以在他们的应用程序中读写数据,无论是从文件,网络或其他源。

  本文将深入探讨Java I/O中的FileInputStreamFileInputStreamInputStream的一个子类,它为Java程序员提供了从文件读取数据的方法。

摘要

  在本文中,我们将探讨FileInputStream的用途,功能和特性。我们还将介绍如何使用FileInputStream从文件中读取数据,并提供一些使用FileInputStream的最佳实践。

FileInputStream

用途和功能

  FileInputStream类提供了一种从文件读取数据的方式。FileInputStream的主要功能包括:

  • 从文件读取文件内容
  • 以字节为单位读取文件内容
  • 支持随机访问
  • 支持mark和reset方法

构造方法

FileInputStream有两个构造方法:

FileInputStream(File file) throws FileNotFoundException
FileInputStream(String name) throws FileNotFoundException

  这些构造函数接受文件的名称或文件对象,并打开文件进行读取。

优缺点

  FileInputStream类是Java中用于读取二进制文件的类,其优点和缺点如下:

优点:

  1. 以字节为单位进行读取,可以读取二进制文件;
  2. 读取速度快,适合读取大文件;
  3. 可以随机访问文件中的任意位置,方便跳过文件头等部分。

缺点:

  1. 无法读取文本文件中的换行符;
  2. 不支持解析Unicode编码的字符;
  3. 读取时需要手动判断文件结束,容易出现错误。

应用场景

FileInputStream类应用场景:

  1. 读取二进制文件,比如图片、音频、视频等文件;
  2. 读取自定义文件格式的数据;
  3. 对于需要快速读取大文件的场景,FileInputStream类可以提供较好的效率;
  4. 对于需要随机访问文件中任意部分的场景,FileInputStream类也可以提供较好的支持。

常用方法

FileInputStream的常用方法包括:

  • int read():读取单个字节。
  • int read(byte[] b):将最多b.length个字节读入byte数组中。
  • int read(byte[] b, int off, int len):将最多len个字节读入byte数组中,从偏移量off开始存储。
  • long skip(long n):跳过n个字节的输入。
  • int available():返回可用的字节数。
  • void close():关闭文件输入流。

最佳实践

使用以下最佳实践在Java应用程序中使用FileInputStream

  • 在读取文件之前,始终检查文件是否存在。
  • 使用try-with-resources语句块关闭文件输入流,以确保在读取文件时始终关闭文件。

使用FileInputStream读取文件

以下示例演示如何使用FileInputStream读取文件:

package com.example.javase.io;

import java.io.FileInputStream;
import java.io.IOException;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/10/13 15:56
 */
public class FileInputStreamTest {

    public static void main(String[] args) {
        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream("./template/hello.txt");

            int content;
            while ((content = inputStream.read()) != -1) {
                System.out.print((char) content);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

  上述代码使用FileInputStream读取名为hello.txt的文件。程序先检查文件是否存在,然后逐个字节读取文件内容并将结果打印到控制台。最后,关闭文件输入流以释放系统资源。

执行结果如下:

image.png

很明显对比hello.txt文本内容读取内容是完整且准确无误的。

image.png

测试用例

如下便用FileInputStream 类进行文件的写入及读取功能进行示例演示,希望能够让大家更深入的了解它,真正把它学会并掌握。

用例代码

为了验证FileInputStream的功能,如下是我用来演示的测试用例,大家请看:

package com.example.javase.io.fileInputStream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/10/13 16:31
 */
public class testReadFile {

    public static void main(String[] args) {
        String content = "Hello, jym! ";
        byte[] contentBytes = content.getBytes();
        FileOutputStream outputStream = null;
        try {
            outputStream = new FileOutputStream("./template/hello.txt");
            outputStream.write(contentBytes);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        FileInputStream inputStream = null;
        try {
            inputStream = new FileInputStream("./template/hello.txt");
            byte[] buffer = new byte[contentBytes.length];
            inputStream.read(buffer);
            String result = new String(buffer);
            System.out.println("content:" + content);
            System.out.println("result:" + result);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }
}

测试代码解析

该代码实现了一个简单的读写文件的功能。具体步骤如下:

  1. 定义字符串 content,将其转化为字节数组 contentBytes

  2. 创建一个 FileOutputStream 对象 outputStream,用于在本地磁盘上创建或打开一个名为 hello.txt 的文件,并将 contentBytes 数组中的内容写入该文件。

  3. 关闭 outputStream 对象。

  4. 创建一个 FileInputStream 对象 inputStream,用于读取 hello.txt 文件中的内容。

  5. 创建一个字节数组 buffer,长度与 contentBytes 相同。

  6. 使用 inputStream 对象的 read() 方法将 hello.txt 中的内容读入 buffer 数组。

  7. buffer 数组转化为字符串 result

  8. 输出 contentresult 进行对比是否相同,如果不同则抛出异常。

  9. 关闭 inputStream 对象。

测试结果

执行如上测试用例,可以得知,与我们写入时的内容是一致的。

image.png

小结

  FileInputStream是Java I/O中的一个重要类,它允许Java程序员从文件中读取数据。本文介绍了如何使用FileInputStream和一些最佳实践。本文还提供了一个简单的测试用例,以验证FileInputStream的功能。

总结

  在本文中,我们深入探讨了Java I/O中的FileInputStream,并介绍了它的用途,功能和特性。我们还介绍了如何使用FileInputStream从文件中读取数据,并提供了一些最佳实践。最后,我们编写了一个测试用例来验证FileInputStream的功能。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

☀️建议/推荐你

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。