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

2023年 10月 13日 32.4k 0

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

在这里插入图片描述

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

环境说明: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有些常用的方法,包括:

  • 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();
        }
    }
    

    上面代码的解释如下:

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

    上面代码的解释如下:

  • 第3行中的代码是一个典型的try-catch块,使用try语句块包含可能抛出FileNotFoundExceptionIOException异常的代码。
  • 在第5行中通过finally块确保InputStream对象一定被关闭。如果在try块中打开InputStream成功,这个对象在finally块中被关闭。如果在try块中打开InputStream失败,finally块中有机会关闭默认为nullInputStream对象。
  • 在catch块中对于FileNotFoundExceptionIOException异常进行了捕获和处理,输出相应的异常信息。
  •   需要注意的是,每个在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」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

    总结

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

    相关文章

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

    发布评论