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

目录

      • 一、为什么要关闭流?
      • 二、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://xiahunao.cn/news/352547.html

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

相关文章

【Linux】还在用top命令?可以试试atop工具,信息一目了然,运维工程师的新选择

atop使用 Linux以其稳定性,越来越多地被用作服务器的操作系统(当然,有人会较真地说一句:Linux只是操作系统内核:)。但使用了Linux作为底层的操作系统,是否我们就能保证我们的服务做到7*24地稳定呢?非也,要…

鲁大师5月新机性能/流畅/久用榜:蓝绿厂霸榜,天玑9200+与高通骁龙8 Gen2迎来首次交锋

性能榜 6.18年中购物节前夕,一众厂商开始扎堆发布新机冲销量,也导致本月的新发机型数量达到了19款。 从品牌来看,ov两家和其子品牌、独立品牌就占据了十二台。从机型定位来看,本月的手机竞争主要围绕中端市场,除了索尼…

BUUCTF misc 专题(49)穿越时空的思念

下载下来是一段音频,听了一下,大致能听出来点东西,将它放入Audacity或者Audition 我这里是放入了Audition 可以明显地看到有摩斯密码,手动敲下来并用在线网站解码 再将它转化成小写(可以使用python)&#…

想你,淡淡的思念

2019独角兽企业重金招聘Python工程师标准>>> 淡淡的夜,思念是风, 将我的心吹向你的身边, 淡淡的夜,牵挂是雨, 将我的爱抛向你的脚下。 淡淡的夜,你在那里? 你在遥远的天边, 淡淡的月…

思念到极致时什么感觉?(1)

故事一: 跟交往了四年的初恋分手后, 他去了北京, 我没找任何同伴独自去了那里, 下车的一瞬间我哭了, 想象着他曾经在这里出现过, 也曾挤在拥挤的人群中。 后来哭累了回到酒店, 翻看着他的朋友圈…

500道网络安全/WEB安全面试题合集!附答案解析

前言 随着国家政策的扶持,网络安全行业也越来越为大众所熟知,想要进入到网络安全行业的人也越来越多。 为了拿到心仪的 Offer 之外,除了学好网络安全知识以外,还要应对好企业的面试。 作为一个安全老鸟,工作这么多年…

能用excel批量提取网页内特定数据吗?

这个需求其实是采集数据,用第三方软件比较合适,当然,用excel也可以批量提取网页内特定文字。请按照以下步骤操作: 1. 打开要提取的网页,并选中要提取的文字,例如一个表格里的数据。 2. 复制选中的文字。 …

新浪微博 mysql_新浪微博,腾讯微博mysql数据库主表猜想

用户信息表(t_user_info)字段名称字节数类型描述 User_id4uint32用户编号(主键) User_name20Char[20]名称 Msg_count4uint32发布消息数量,可以作为t_msg_info水平切分新表的auto_increment Fans_count4uint32粉丝数量 Follow_count4Uint32关注对象数量 备注:以User_…

android微博客户端下载,iBeebo微博客户端

iBeebo微博客户端是一款免费的开源微博客户端,比起官方的手机客户端这款应用显然要小巧的多,它没有那些多余的无用功能。iBeebo微博客户端支持私信,你还可以查看热门话题和热门微博,喜欢的朋友不要错过哦!赶紧来最火软件站点击iBe…

2022年12月最新微博新版批量删除微博博文代码_删除清空微博博文的微博批量删除代码与方法

2022年12月微博新版本界面批量删除微博博文的方法 2022最新批量删除微博丨怎么一键批量删除微博与删除关注? 本教程为:一键批量删除新浪微博以前发过的微博(作者:当时我就没憋住) 新浪微博本身不提供批量删除微博的方法,,下面就…

基于IOS的仿微博系统

这份需求说明书的目的是直接对基于MVC模式的微博系统进行需求分析和系统总体设计服务。本说明书面向的读者是进行需求分析的人员和进行系统总体设计的人员。在开发的时候做了ppt、演示视频源码等需要可联系企鹅:2415273018。主要工作是设计实现一款个性化的基 于iOS…

微博java版_新浪微博JAVA通用版

这是新浪微博JAVA通用版,专为JAVA用户打造。无论您身处何地,随时随地记录生活的点点滴滴,与好友分享。 软件介绍 新浪微博JAVA通用版是专为Java平台用户打造的新浪微博手机客户端,功能强大。完全支持阅读、发布、评论、转发、私信…

android 微博发布,手机上怎么用微博?手机如何发广播?

1 如何安装Android微博 Android微博可以通过以下两种方式进行安装:在Android market中下载腾讯微博Android版进行安装 在腾讯微博官网下载apk文件进行安装 2 腾讯微博Android客户端,可以用邮箱地址注册微博帐号吗? 非常抱歉,目前A…

腾讯微博android版本,腾讯微博

安装与下载 1 如何获取一个腾讯微博iPhone客户端? 首先请确认您已经拥有了一个iTunes帐号,可以通过该帐号在App store中下载应用。(如何获取该帐号了解更多) 您可以通过电脑中的iTunes软件将下载到电脑的腾讯微博iPhone客户端同步到您的iPhone中 您也可以…

用计算机上发微博,电脑版新浪微博怎么使用?新浪微博基本使用方法介绍

新浪微博能在第一时间传递最新消息,消息传播速度快、信息量大,在这里可以了解最新信息,可以学习经验,可以找到喜爱的各种小组,深受现代生活人们的喜爱,而新浪微博自2009年开始公测以来,已经拥有…

前端自动化测试基础概念与方案

测试的类型 常见的测试类型主要有以下几种: 单元测试:验证独立单元是否能正常工作集成测试:验证多个单元协同工作端到端测试:从用户角度以机器的方式在真实浏览器环境验证应用交互快照测试:验证程序的UI变化 单元测…

第1章:SpringMVC简介

一、SpringMVC 1.Java语言学习流程 2.SpringMVC的主要内容 二、SpringMVC简介 1.什么是MVC MVC是一种软件架构的思想,将软件按照模型,视图,控制器划分M:Model,模型层,指工程中的JavaBean,作用…

5个小时,搭出2套应用,这一低代码平台很强劲!

现代管理学之父德鲁克提及创新本质时,说了两点: 一是让昂贵的东西变得便宜,老百姓能用;二是让高门槛东西变得低门槛,普通人可用。 而低代码正符合这两个条件。 一、背景 所谓低代码,是一种软件开发方法&…

一周信创舆情观察(12.7~12.13)

一、一周舆情要点 行业方面,2020年集成电路设计行业销售额预计为3819.4亿元,比2019年的3084.9亿元增长23.8%。日前,我国自主研发的一项物联网安全测试技术(TRAIS-P TEST)由国际标准化组织/国际电工委员会(ISO/IEC)发布…

以评促建,推动高效惠民数字政府建设——2018数字政府建设论坛暨第十七届中国政府网站绩效评估结果发布会在京召开...

导语:放眼世界,政府数字化转型已成大势所趋。纵观国内,建设数字政府、数字中国逐渐升至新时代国家发展战略。作为数字中国体系重要组成部分的数字政府,是实现数字中国建设目标、推动社会经济高质量发展的重要抓手。结合国家要求&a…