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

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
在Java应用程序开发中,输入输出(I/O)操作是必不可少的一部分。Java语言的I/O模型基于流(Stream),其中InputStream和OutputStream是两个基本抽象类。这些类使Java程序员可以在他们的应用程序中读写数据,无论是从文件,网络或其他源。
本文将深入探讨Java I/O中的FileInputStream。FileInputStream是InputStream的一个子类,它为Java程序员提供了从文件读取数据的方法。
摘要
在本文中,我们将探讨FileInputStream的用途,功能和特性。我们还将介绍如何使用FileInputStream从文件中读取数据,并提供一些使用FileInputStream的最佳实践。
FileInputStream
用途和功能
FileInputStream类提供了一种从文件读取数据的方式。FileInputStream的主要功能包括:
- 从文件读取文件内容
- 以字节为单位读取文件内容
- 支持随机访问
- 支持mark和reset方法
构造方法
FileInputStream有两个构造方法:
FileInputStream(File file) throws FileNotFoundException
FileInputStream(String name) throws FileNotFoundException
这些构造函数接受文件的名称或文件对象,并打开文件进行读取。
优缺点
FileInputStream类是Java中用于读取二进制文件的类,其优点和缺点如下:
优点:
- 以字节为单位进行读取,可以读取二进制文件;
- 读取速度快,适合读取大文件;
- 可以随机访问文件中的任意位置,方便跳过文件头等部分。
缺点:
- 无法读取文本文件中的换行符;
- 不支持解析
Unicode编码的字符; - 读取时需要手动判断文件结束,容易出现错误。
应用场景
FileInputStream类应用场景:
- 读取二进制文件,比如图片、音频、视频等文件;
- 读取自定义文件格式的数据;
- 对于需要快速读取大文件的场景,
FileInputStream类可以提供较好的效率; - 对于需要随机访问文件中任意部分的场景,
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的文件。程序先检查文件是否存在,然后逐个字节读取文件内容并将结果打印到控制台。最后,关闭文件输入流以释放系统资源。
执行结果如下:

很明显对比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。输出
content和result进行对比是否相同,如果不同则抛出异常。关闭
inputStream对象。
测试结果
执行如上测试用例,可以得知,与我们写入时的内容是一致的。

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

- 点赞
- 收藏
- 关注作者
评论(0)