「深入理解Java输入流:InputStream」

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


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

js 复制代码
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

前言

Java作为一门广泛应用于Web开发、移动开发、游戏开发等各种领域的编程语言,其输入输出流的处理也是非常重要的。而其中,输入流(InputStream)则是读取数据的重要方式之一。本文将深入探讨Java输入流的相关知识点,包括如何使用InputStreamInputStream的常用方法和注意事项等。

摘要

本文主要介绍Java输入流(InputStream)的相关知识,包括InputStream的概述、方法和使用,还介绍了如何从InputStream中读取数据、如何处理异常等细节问题。其中,我们使用了一些常见的方法,如read()read(byte[] b)skip()等等。所有的代码都有相应的注释,帮助读者更好地理解每一行代码的含义。

InputStream

概述

InputStreamJava I/O库中的一个基本类,它是所有输入流的父类。InputStream用于从输入源读取数据,如文件、网络流、字符串等等。通过InputStream类的子类,我们可以读取各种不同的数据类型(如字节、字符、字符串等)。InputStream在Java中的位置如下图所示:

常用方法

InputStream有些常用的方法,包括:

  1. read()方法:从输入流中读取一个字节的数据。如果已到达流的末尾,返回-1,否则返回读取的字节数据。
  2. read(byte[] b)方法:从输入流中读取最多b.length个字节的数据到字节数组中。如果已到达流的末尾,返回-1,否则返回读取的字节数。
  3. skip(long n)方法:从输入流中跳过并丢弃n个字节的数据并返回实际跳过的字节数。
  4. available()方法:返回可以从输入流中读取的字节数。
  5. close()方法:关闭输入流,并释放与之相关的资源。

从InputStream中读取数据

使用InputStream读取数据的基本步骤如下:

java 复制代码
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();
    }
}

上面代码的解释如下:

  1. 第1行创建了一个InputStream对象,这里用的是FileInputStream,读取的是同目录下的文件hello.txt
  2. 第3行-第5行实现了从输入流中读取数据,并且将读取到的数据存储到缓冲区中。
  3. 在第6行中读取到的数据可以进行相应的处理,如写入文件、打印到控制台等等。
  4. 最后在第8行中关闭输入流,释放与之相关的资源。

InputStream的异常处理

使用InputStream读取数据时,有可能会出现一些异常情况,这时候需要进行相应的异常处理。下面是一个典型的InputStream异常处理代码示例:

java 复制代码
    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();
            }
        }
    }

上面代码的解释如下:

  1. 第3行中的代码是一个典型的try-catch块,使用try语句块包含可能抛出FileNotFoundExceptionIOException异常的代码。
  2. 在第5行中通过finally块确保InputStream对象一定被关闭。如果在try块中打开InputStream成功,这个对象在finally块中被关闭。如果在try块中打开InputStream失败,finally块中有机会关闭默认为nullInputStream对象。
  3. 在catch块中对于FileNotFoundExceptionIOException异常进行了捕获和处理,输出相应的异常信息。

需要注意的是,每个在try块中打开的资源都需要在finally块中关闭。这是因为在finally块中的代码一定会被执行,无论try块中是否出现异常。

测试用例

下面是一个基本测试用例,测试输入流从文件hello.txt中读取数据的功能:

代码示例

java 复制代码
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读取文件内容。具体解析如下:

  1. 创建InputStream对象

通过使用FileInputStream类创建一个InputStream对象,该类用于从文件系统中打开一个文件进行读取。在此过程中可能会抛出FileNotFoundException异常,需要进行捕获和处理。

  1. 读取数据

使用read()方法从文件输入流中读取数据。在此过程中可能会抛出IOException异常,需要进行捕获和处理。read()方法会返回从输入流中读取的字节数,如果返回值为-1,表示已经读取到了文件的末尾。这里将读取到的字节数组转换成字符串输出到控制台。

  1. 关闭流

在读取数据完成之后,必须关闭文件流。关闭文件流有助于释放文件资源并避免内存泄漏。需要在finally块中使用close()方法关闭文件流,在关闭文件流的过程中可能会抛出IOException异常,需要进行捕获和处理。

测试执行结果

当我们运行上面的测试用例时,可以看到从hello.txt中读取到的数据将会输出到控制台上。

测试用例执行截图演示:

注意事项

  1. InputStream是一个抽象类,不能直接实例化。
  2. 通过InputStream的子类对象来读取数据时,应该使用缓冲区数组来减少读取次数,提高效率。
  3. 对于大文件的读取,为了避免发生OutOfMemory的情况,应当考虑使用分段读取的方式,而不是一次读入整个文件。

小结

本文介绍了Java输入流InputStream的相关知识,包括InputStream的概述、常用方法、从InputStream中读取数据、异常处理以及注意事项等。同时,本文还提供了测试用例来帮助读者更好地理解和应用相关知识。希望读者们能够通过本文的学习,更好地掌握Java输入流的相关知识,并且能够在实际的项目中熟练应用。

附录源码

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

总结

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


相关推荐
冷琴19968 分钟前
基于java+springboot的酒店预定网站、酒店客房管理系统
java·开发语言·spring boot
九圣残炎31 分钟前
【springboot】简易模块化开发项目整合Redis
spring boot·redis·后端
daiyang123...34 分钟前
IT 行业的就业情况
java
爬山算法1 小时前
Maven(6)如何使用Maven进行项目构建?
java·maven
.生产的驴1 小时前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
爱学的小涛1 小时前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
吹老师个人app编程教学1 小时前
详解Java中的BIO、NIO、AIO
java·开发语言·nio
爱学的小涛1 小时前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪1 小时前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
琴智冰1 小时前
SpringBoot
java·数据库·spring boot