咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java之IO流啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
Java作为一门广泛应用于Web开发、移动开发、游戏开发等各种领域的编程语言,其输入输出流的处理也是非常重要的。而其中,输入流(InputStream
)则是读取数据的重要方式之一。本文将深入探讨Java输入流的相关知识点,包括如何使用InputStream
、InputStream
的常用方法和注意事项等。
摘要
本文主要介绍Java输入流(InputStream
)的相关知识,包括InputStream
的概述、方法和使用,还介绍了如何从InputStream
中读取数据、如何处理异常等细节问题。其中,我们使用了一些常见的方法,如read()
、read(byte[] b)
、skip()
等等。所有的代码都有相应的注释,帮助读者更好地理解每一行代码的含义。
InputStream
概述
InputStream
是Java I/O
库中的一个基本类,它是所有输入流的父类。InputStream
用于从输入源读取数据,如文件、网络流、字符串等等。通过InputStream
类的子类,我们可以读取各种不同的数据类型(如字节、字符、字符串等)。InputStream
在Java中的位置如下图所示:
常用方法
InputStream
有些常用的方法,包括:
read()
方法:从输入流中读取一个字节的数据。如果已到达流的末尾,返回-1,否则返回读取的字节数据。read(byte[] b)
方法:从输入流中读取最多b.length个字节的数据到字节数组中。如果已到达流的末尾,返回-1,否则返回读取的字节数。skip(long n)
方法:从输入流中跳过并丢弃n个字节的数据并返回实际跳过的字节数。available()
方法:返回可以从输入流中读取的字节数。close()
方法:关闭输入流,并释放与之相关的资源。从InputStream中读取数据
使用InputStream
读取数据的基本步骤如下:
package com.example.javase.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* @author bug菌
* @version 1.0
* @date 2023/10/13 14:48
*/
public class InputStreamTest {
public static void main(String[] args) throws IOException {
//1. 创建InputStream对象
InputStream inputStream = new FileInputStream("./template/hello.txt");
//2. 读取数据并写入缓冲区
byte[] buf = new byte[1024];
int len = 0;
while ((len = inputStream.read(buf)) > 0) {
//3. 对读取到的数据进行处理
//...
}
//4. 关闭输入流
inputStream.close();
}
}
上面代码的解释如下:
InputStream
对象,这里用的是FileInputStream
,读取的是同目录下的文件hello.txt
。InputStream的异常处理
使用InputStream
读取数据时,有可能会出现一些异常情况,这时候需要进行相应的异常处理。下面是一个典型的InputStream
异常处理代码示例:
public static void main(String[] args) throws IOException {
//1. 创建InputStream对象
InputStream inputStream = null;
try{
inputStream = new FileInputStream("./template/hello.txt");
//2.读取数据
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}finally{
//3.关闭文件流
try{
inputStream.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
上面代码的解释如下:
try-catch
块,使用try语句块包含可能抛出FileNotFoundException
和IOException
异常的代码。finally
块确保InputStream
对象一定被关闭。如果在try
块中打开InputStream
成功,这个对象在finally
块中被关闭。如果在try块中打开InputStream
失败,finally
块中有机会关闭默认为null
的InputStream
对象。FileNotFoundException
和IOException
异常进行了捕获和处理,输出相应的异常信息。 需要注意的是,每个在try块中打开的资源都需要在finally
块中关闭。这是因为在finally
块中的代码一定会被执行,无论try块中是否出现异常。
测试用例
下面是一个基本测试用例,测试输入流从文件hello.txt
中读取数据的功能:
代码示例
package com.example.javase.io;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/**
* @author bug菌
* @version 1.0
* @date 2023/10/13 14:48
*/
public class InputStreamTest {
public static void main(String[] args) {
InputStream inputStream = null;
try {
//1.创建InputStream对象
inputStream = new FileInputStream("./template/hello.txt");
//2.读取数据
byte[] buf = new byte[1024];
int len = 0;
while ((len = inputStream.read(buf)) > 0) {
String str = new String(buf, 0, len);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭文件流
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
代码解析
以上代码是一个Java IO示例程序,用于演示如何使用InputStream
读取文件内容。具体解析如下:
InputStream
对象 通过使用FileInputStream
类创建一个InputStream
对象,该类用于从文件系统中打开一个文件进行读取。在此过程中可能会抛出FileNotFoundException
异常,需要进行捕获和处理。
使用read()
方法从文件输入流中读取数据。在此过程中可能会抛出IOException
异常,需要进行捕获和处理。read()
方法会返回从输入流中读取的字节数,如果返回值为-1,表示已经读取到了文件的末尾。这里将读取到的字节数组转换成字符串输出到控制台。
在读取数据完成之后,必须关闭文件流。关闭文件流有助于释放文件资源并避免内存泄漏。需要在finally
块中使用close()
方法关闭文件流,在关闭文件流的过程中可能会抛出IOException
异常,需要进行捕获和处理。
测试执行结果
当我们运行上面的测试用例时,可以看到从hello.txt
中读取到的数据将会输出到控制台上。
测试用例执行截图演示:
注意事项
InputStream
是一个抽象类,不能直接实例化。InputStream
的子类对象来读取数据时,应该使用缓冲区数组来减少读取次数,提高效率。OutOfMemory
的情况,应当考虑使用分段读取的方式,而不是一次读入整个文件。小结
本文介绍了Java输入流InputStream
的相关知识,包括InputStream
的概述、常用方法、从InputStream
中读取数据、异常处理以及注意事项等。同时,本文还提供了测试用例来帮助读者更好地理解和应用相关知识。希望读者们能够通过本文的学习,更好地掌握Java输入流的相关知识,并且能够在实际的项目中熟练应用。
附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
总结
InputStream
是Java I/O
库中的一个重要基本类,用于从输入源读取数据,并提供了一些常用的方法,如read()
、read(byte[] b)
、skip()
等等。在使用它时,需要注意很多细节问题,如如何正确地关闭输入流和处理异常等。通过本文的学习,相信读者们对于Java输入流相关的知识和应用将会更加熟练。
... ...
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。
「赠人玫瑰,手留余香」,咱们下期拜拜~~
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。