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

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


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

js 复制代码
环境说明: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有两个构造方法:

java 复制代码
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读取文件:

java 复制代码
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的功能,如下是我用来演示的测试用例,大家请看:

java 复制代码
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 对象。

测试结果

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

小结

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电子书籍、简历模板等海量资料。


相关推荐
程序员-珍9 分钟前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
liuxin3344556627 分钟前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
2401_8572979136 分钟前
招联金融2025校招内推
java·前端·算法·金融·求职招聘
福大大架构师每日一题1 小时前
23.1 k8s监控中标签relabel的应用和原理
java·容器·kubernetes
金灰1 小时前
HTML5--裸体回顾
java·开发语言·前端·javascript·html·html5
菜鸟一皓1 小时前
IDEA的lombok插件不生效了?!!
java·ide·intellij-idea
爱上语文1 小时前
Java LeetCode每日一题
java·开发语言·leetcode
bug菌1 小时前
Java GUI编程进阶:多线程与并发处理的实战指南
java·后端·java ee
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
极客先躯2 小时前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略