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

2023年 10月 13日 41.3k 0

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述

🏆本文收录于「滚雪球学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的常用方法包括:

  • 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的文件。程序先检查文件是否存在,然后逐个字节读取文件内容并将结果打印到控制台。最后,关闭文件输入流以释放系统资源。

执行结果如下:

在这里插入图片描述
很明显对比hello.txt文本内容读取内容是完整且准确无误的。

在这里插入图片描述

测试用例

如下便用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();
            }
        }
    }
}

测试代码解析

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

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

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

  • 关闭 outputStream 对象。

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

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

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

  • buffer 数组转化为字符串 result

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

  • 关闭 inputStream 对象。

  • 测试结果

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

    在这里插入图片描述

    小结

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

    总结

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

    ... ...

      ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。

    「赠人玫瑰,手留余香」,咱们下期拜拜~~

    附录源码

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

    ☀️建议/推荐你

      无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

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

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

    📣关于我

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

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论