【Java基础】I/O流 —— Java中的流都需要关闭吗?

这篇具有很好参考价值的文章主要介绍了【Java基础】I/O流 —— Java中的流都需要关闭吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么要关闭流?

涉及到对外部资源的读写操作,包括网络、硬盘等等的I/O流,如果在使用完毕之后不关闭,会导致资源泄漏以及可能会引起文件锁定等问题。因此,需要在使用完毕之后关闭流。
关闭流是一种资源释放机制,意味着在使用完毕之后归还系统的内存、CPU或者网络等资源,避免资源长时间占用。常见的关闭流的方法是调用close()方法,该方法会将相关的资源释放,可以有效避免导致资源泄漏的问题。
需要注意的是,关闭流的时机非常重要,过早关闭可能会影响正常操作,而过晚关闭则可能导致资源泄漏。在实际开发的时候,使用完毕之后应该及时关闭流。在Java 7之后引入了try-with-resources语法,可以在语法层面上自动关闭流,用法是:

/* 读取文件 */
File file = new File("opsLiya.json");
try (FileInputStream fileInputStream = new FileInputStream(file)) {
    /* 操作 */
}catch (IOException e){
    /* 异常处理 */
}

当然也可以使用传统的finally代码块关闭流:

InputStream inputStream = null;
try {
    inputStream = new FileInputStream("opsLiya.txt");
    /* 操作 */
} catch (IOException e) {
    /* 异常处理 */
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch (IOException e) {
            /* 异常处理 */
        }
    }
}

二、close方法和flush方法

1.使用close方法

当我们使用输入流的时候,如FileInputStream,对流进行关闭时,直接调用close方法即可。
close方法的底层如下:
java为什么要关闭流,java,jvm

这个close0方法的底层是一个native方法(本地方法)
java为什么要关闭流,java,jvm

此方法进行具体的关闭操作。

2.使用flush方法

当我们使用输出流的时候(即写入数据到文件或者网络中),如BufferedOutputStream,对流进行关闭时,需要先调用flush方法再调用close方法
我们进入到BufferedOutputStream的flush方法的源码可以看到:
java为什么要关闭流,java,jvm

方法注释大概的意思是:刷新此缓冲输出流。这将强制将任何缓冲的输出字节写入底层输出流。
也就是说,在关闭流前调用flush方法,会将缓存中的数据强行刷新到输出目标中,避免数据丢失

三、流按指向分类

Java中的流在指向上可以分为两大类,分别是用于读写内存的流用于读写外部资源(文件、网络等)的流。
比如,用于读写内存的流又可以根据操作对象分为两类,如下:

  1. 操作对象是byte数组:
    1. ByteArrayInputStream
    2. ByteArrayOutputStream
  2. 操作对象是字符串:
    1. StringReader
    2. StringWriter

而用于读写外部资源的流,有如下这些:

  1. FileInputStream和 FileOutputStream:用于字节流读写文件;
  2. FileReader和FileWriter:用于字符流读写文件;
  3. BufferedInputStream和BufferedOutputStream:用于缓存读写字节流提升IO性能;
  4. BufferedReader和BufferedWriter:用于缓存读写字符流提升IO性能;
  5. DataInputStream和DataOutputStream:可以用于读写整数、浮点数等基本类型的字节流;
  6. ObjectInputStream和ObjectOutputStream:用于读写Java对象的字节流;
  7. Socket和ServerSocket:用于网络数据传输;
  8. HttpURLConnection:用于HTTP请求等。

四、不用关闭的流

对于Java中的ByteArrayInputStreamByteArrayOutputStream,它们都是在内存中进行读写操作,不需要涉及到底层的外部资源(如文件、网络等等),因此在使用完毕后不一定需要显式地调用close方法去关闭。它们占用的内存将会被JVM自动回收。
我们可以去到ByteArrayInputStream的close方法实现是一个空方法,如下:
java为什么要关闭流,java,jvm

当然,我们也可以手动释放它们占用的内存——使用try-with-resources语法:

byte[] data = new byte[]{1, 2, 3, 4, 5};
try (ByteArrayInputStream bis = new ByteArrayInputStream(data);
  ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
 /* 操作 */
} catch (IOException e) {
 /* 异常处理 */
}

注意:虽然它的close方法是空实现,但是我们为了保证代码的可读性和健壮性,仍然应该在使用完毕后及时关闭它们。文章来源地址https://www.toymoban.com/news/detail-527297.html

到了这里,关于【Java基础】I/O流 —— Java中的流都需要关闭吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SRS关闭无人观看的流

    这里需要使用到SRS自身自带的钩子回调功能,配置文件中有标注: Hook函数: 分为on_publish、on_play、on_stop、on_unpublish、on_dvr等类别; 其中主要介绍on_play、on_stop on_play: 主要用于用户在对srs拉流进行播放的时候触发; on_stop: 主要用于用户在停止播放的时候触发; 要做到关闭

    2024年02月21日
    浏览(23)
  • Java核心技术知识点笔记—Java SE 8的流库(二)

    前言:约简是一种终结操作(terminal operation),它们会将流约简为可以在程序中使用的非流值。例如:Stream中的count方法,返回流中元素的数量。 1、简单约简举例: (1)OptionalT max(Comparator? super T comparator):使用给定的comparator规则,产生流的最大元素,如果流为空,则产生一

    2023年04月18日
    浏览(49)
  • Java中的实体类为什么要 implements Serializable?

    1. 序列化和反序列化 首先来解释一下什么是序列化和反序列化: 序列化 :把对象转换为字节序列的过程称为对象的序列化。 反序列化 :把字节序列恢复为对象的过程称为对象的反序列化。 在 Java 和其他语言进行通信的时候,需要将对象转化成一种通用的格式例如Json( 转换

    2023年04月20日
    浏览(50)
  • Java基础:为什么hashmap是线程不安全的?

    HashMap 是线程不安全的主要原因是它的内部结构和操作不是线程安全的。下面是一些导致 HashMap 线程不安全的因素: 非同步操作:HashMap 的操作不是线程同步的,也就是说,在多线程环境下同时对 HashMap 进行读写操作可能会导致数据不一致的问题。 非原子操作:HashMap 的操作

    2024年02月10日
    浏览(36)
  • 为什么商业基础软件需要开源

    Bytebase 本身是一家商业软件公司,而作为最核心资产的代码从 Day 0 却是开源的。同时我们还是 star-history.com 的运营者,大家在各种开源渠道会看到它生成的图: 一直以来,常会被别人问起的一个问题,就是为什么 Bytebase 要开源。结合这 2 年多的实战经验,一次性把能想到的

    2024年02月13日
    浏览(95)
  • 【Day1】零基础学java--》记事本运行java程序,通熟语言让你彻底明白为什么配置java环境变量

    前言: 大家好,我是 良辰丫 ,从今天开始我将协同大家一起从零基础学习Java,期待与君为伴,走向海的彼岸。💕💕💕 🧑个人主页:良辰针不戳 📖所属专栏:EveryDay零基础学java 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期

    2024年02月11日
    浏览(41)
  • 什么是 Java 中的数据库连接池?为什么使用连接池来管理数据库连接?

    数据库连接池(database connection pool)是在 Java 中用于管理数据库连接的一种技术。它的主要目的是提高数据库连接的重用性和性能。在传统的数据库连接方式中,每次与数据库建立连接时都需要进行一系列的网络通信和身份验证操作,这样的开销较大并且会影响应用程序的性

    2024年02月06日
    浏览(58)
  • 什么是OSPF?为什么需要OSPF?OSPF基础概念

    开放式最短路径优先OSPF(Open Shortest Path First)是IETF组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。 目前针对IPv4协议使用的是OSPF Version 2(RFC2328);针对IPv6协议使用OSPF Version 3(RFC2740)。如无特殊说明,本文中所指的OSPF均为OSPF Version 2。 目录 为什么

    2024年01月20日
    浏览(55)
  • 学习大数据,所需要的java(Maven)基础(1)

    maven是干什么用,的我们先通过企业开发中的时间需求来看一看那些方面是我们技术不足。 java项目,每个项目需要复制一份jar包,Maven后只在本地仓库中保存一份 java项目,自己去网上找jar包,费劲心血找的jar包里面有的时候并没有你需要的哪个类。 Maven就会自动从仓库进行

    2024年04月26日
    浏览(42)
  • 学习大数据,所需要的java(Maven)基础(2)

    以对Spring的jar包依赖为例:Spring的每一个版本中都包含spring-context,springmvc等jar包。我们应该导入版本一致的Spring jar包,而不是使用4.0.0的spring-context的同时使用4.1.1的springmvc。 问题是如果我们想要将这些jar包的版本统一升级为4.1.1,是不是要手动一个个修改呢?显然,我们有

    2024年04月29日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包