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

news2024/12/19 19:02:10

目录

      • 一、为什么要关闭流?
      • 二、close方法和flush方法
        • 1.使用close方法
        • 2.使用flush方法
      • 三、流按指向分类
      • 四、不用关闭的流

一、为什么要关闭流?

涉及到对外部资源的读写操作,包括网络、硬盘等等的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方法的底层如下:
在这里插入图片描述

这个close0方法的底层是一个native方法(本地方法)
在这里插入图片描述

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

2.使用flush方法

当我们使用输出流的时候(即写入数据到文件或者网络中),如BufferedOutputStream,对流进行关闭时,需要先调用flush方法再调用close方法
我们进入到BufferedOutputStream的flush方法的源码可以看到:
在这里插入图片描述

方法注释大概的意思是:刷新此缓冲输出流。这将强制将任何缓冲的输出字节写入底层输出流。
也就是说,在关闭流前调用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方法实现是一个空方法,如下:
在这里插入图片描述

当然,我们也可以手动释放它们占用的内存——使用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方法是空实现,但是我们为了保证代码的可读性和健壮性,仍然应该在使用完毕后及时关闭它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity基础框架从0到1(六)对象池模块

索引 这是Unity基础框架从0到1的第六篇文章,框架系列的项目地址是:https://github.com/tang-xiaolong/SimpleGameFramework 文章最后有目前框架系列的思维导图,前面的文章和对应的视频我一起列到这里: 文章 Unity基础框架从0到…

算力不竭如江海,天翼云“息壤”如何助力千行百业算力智能调度?

科技云报道原创。 数字时代下,算力已成为新型生产力,并朝着多元泛在、安全可靠、绿色低碳的方向演进。以算力为核心的数字信息基础设施,是国家战略性布局的关键组成部分,也成为数字经济时代的“大国重器”。 作为云服务国家队&am…

报表生成器FastReport .Net教程:“Text“对象、文本编辑

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案,使用FastReport .NET可以创建独立于应用程序的.NET报表,同时FastReport .Net支持中文、英语等14种语言,可以让你的产品保证真正的国际性。 FastReport.NET官方版…

es elasticsearch 十四 各种机制 评分机制 正序索引 解决跳跃结果问题 解决耗时过长问题 解决相同属性值都到一个地方

目录 评分机制 机制 查看评分实现如何算出来的explaintrue 分析能否被搜索到 Doc value 正排序索引 Query phase Fetch phase Preference 问题 解决跳跃结果问题 Timeout 到达时间直接返回,解决耗时过长问题 Routing 数据准确分配到某地,解决相…

这才叫软件测试工程师,你那最多是混口饭吃罢了....

前些天和大学室友小聚了一下,喝酒喝大发了,谈天谈地谈人生理想,也谈到了我们各自的发展,感触颇多。曾经找工作我迷茫过、徘徊不,毕业那会我屡屡面试失败,处处碰壁;工作两年后我一度想要升职加薪…

006+limou+C语言“堆的实现”与“树的相关概念”

0.前言 这里是limou3434的一篇个人博文,感兴趣可以看看我的其他内容。本次我给您带来的是树的相关只是,并且把堆这一数据结构做了实现,后面还有大量的oj题目。但是树重点也就在这十多道oj题目中,您可以尝试着自己做一下&#xff…

我的创作纪念日|写在CSDN创作第512天

机缘 今天无意中发现CSDN后台给我发送私信,才发觉原来我的第一篇博客更新已经过去512天了,512天一晃而过居然还有点恍然。 作为一名网络专业的在校大学生,最初开始查找相关的资料其实更习惯于从外站进行查找,却总是在不经意中进入…

人事管理项目-前端实现

人事管理项目-前端实现 引入Element和Axios开发Login页面配置路由配置请求转发启动前端项目 引入Element和Axios 前端UI使用Element,网络请求则使用Axios,因此首先安装Element和Axios依赖,代码如下: 依赖添加成功后,接…

N-propargyloxycarbonyl-L-lysine,1215204-46-8,是一种基于赖氨酸的非天然氨基酸 (UAA)

产品描述: N-ε-propargyloxycarbonyl-L-lysine (H-L-Lys(Poc)-OH) 是一种基于赖氨酸的非天然氨基酸 (UAA)。 广泛用于多种生物体中荧光探针的生物偶联。 N- ε- Propargyloxycarbonyl-L-lysine (H-L-Lys (Poc) - OH) is a non natural amino acid (UAA) based on …

Kotlin Channel系列(一)之读懂Channel每一行源码

文章目录 有话说概述初识ChannelChannel种类Channel五大金刚SendReceiveClosedQueueBuffer Channel的行为Channel源码分析发送数据大动脉接收数据大动脉父类默认实现方式(RendezvousChannel)发送流程send()函数onSend()函数 接收流程receiveCatching()函数onReceiveCatching()函…

基于图像处理的圆检测与深度学习

基于图像处理的圆检测与深度学习 摘 要一、 绪论二 、图像预处理2.1 滤波算法2.2 边缘检测 三 、圆识别与定位算法3.2 定位算法3.2.1 迭代算法 4.1 数据处理 五、深度学习介绍:参考文献 摘 要 本文主要论述在图像处理的的基础上,为了克服图像背景中的亮…

SpringBootWeb案例-2(下)

3. 修改员工 需求:修改员工信息 在进行修改员工信息的时候,我们首先先要根据员工的ID查询员工的信息用于页面回显展示,然后用户修改员工数据之后,点击保存按钮,就可以将修改的数据提交到服务端,保存到数据…

面试专题:java虚拟机(2)

8.垃圾收集有哪些算法,各自的特点? 标记清除 直接将要回收的对象标记,发送gc的时候直接回收:特点回收特别快,但是回收以后会造成 很多不连续的内存空间,因此适合在老年代进行回收,CMS(current…

Linux--ServerProgramming--(4)详解 I/O复用

1. I/O 复用功能 I/O 复用能同时监听多个文件描述符。 I/O 复用本身是阻塞的。 当有多个文件描述符同时就绪时:若不采取额外措施,程序就只能按顺序一次处理其中的每一个文件描述符,这使得服务器程序看起来是串行工作的。若要实现并发&#…

ChatGPT市场营销指南震撼出炉,你错过了?!

ChatGPT是一种基于AI技术的语言模型,它可以与用户进行对话和交互。它被广泛应用于各个领域,包括市场营销。作为一名市场营销人员,您可以使用ChatGPT来获得创意、解决问题和生成内容。 下面是190个ChatGPT提示,可帮助营销人员更好…

oracle自定义函数 for in loop示例

1、新建type,就是返回结果集有什么,这里就写什么(相当于表的字段) CREATE OR REPLACE TYPE "TYPE_NQ_FORM_STATISTICS" as object (recordid varchar2(500),form_name varchar2(200),sortone varchar2(100),sorttwo …

华为od机试题目回顾

今天去做了华为机试&#xff0c;两道一星题&#xff0c;一道二星题。 一星题 1&#xff1a; 题目主要大意&#xff1a; 输入一串字符串&#xff0c;里面可能包含有(x,y)的坐标。 0<x<1000&#xff0c;0<y<1000&#xff0c;类似(01,1)、(1,01)、(0,100)的都是非法坐…

Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作

场景 java开发手册中对于循环体中进行字符串的拼接要求如下&#xff1a; 【推荐】循环体内&#xff0c;字符串的连接方式&#xff0c;使用 StringBuilder 的 append 方法进行扩展。 说明&#xff1a;下例中&#xff0c;反编译出的字节码文件显示每次循环都会 new 出一个 Str…

【Linux】-自动化构建工具(make/makefile)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言 前言 今天我们来讲讲再Linux中开发必备的一项技能&#xff0c;没有这个…

【OpenMMLab AI实战营第二期】深度学习预训练与MMPretrain

深度学习预训练与MMPretrain MMPreTrain 算法库介绍 MMPretrain 是一个全新升级的预训练开源算法框架&#xff0c;旨在提供各种强大的预训练主干网络&#xff0c; 并支持了不同的预训练策略。MMPretrain 源自著名的开源项目 MMClassification 和 MMSelfSup&#xff0c;并开发…