返回顶部
首页 > 资讯 > 后端开发 > JAVA >【Java基础】I/O流 —— Java中的流都需要关闭吗?
  • 788
分享到

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

javajvm 2023-09-03 18:09:25 788人浏览 安东尼
摘要

目录 一、为什么要关闭流?二、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方法是空实现,但是我们为了保证代码的可读性和健壮性,仍然应该在使用完毕后及时关闭它们。

来源地址:https://blog.csdn.net/qq_44778023/article/details/131050269

--结束END--

本文标题: 【Java基础】I/O流 —— Java中的流都需要关闭吗?

本文链接: https://www.lsjlt.com/news/392675.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Java基础】I/O流 —— Java中的流都需要关闭吗?
    目录 一、为什么要关闭流?二、close方法和flush方法1.使用close方法2.使用flush方法 三、流按指向分类四、不用关闭的流 一、为什么要关闭流? 涉及到对...
    99+
    2023-09-03
    java jvm
  • 关于java中I/O流的字节流与字符流的详细介绍
    一、绪论如果要进行文件内容的操作那么必须依靠数据流完成,而数据流分为两种:字节流:InputStream(字节输入流)、OutputStream(字节输出流);字符流:Reader(字符输入流)、Writer(字符输出流);二、区别字节流是...
    99+
    2017-12-15
    java教程 java I/O 字节流 字符流
  • Java基础知识之I/O流和File类文件操作
    目录♒I/O流原理及流的分类I/O原理I/O流的分类️文件(File)概念✍️常用操作(File类)总结♒I/O流原理及流的分类 I/O原理 I/O是Input和Output的缩写,...
    99+
    2024-04-02
  • Java基础知识之I/O流和File类文件操作方法
    今天小编给大家分享一下Java基础知识之I/O流和File类文件操作方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。♒I/...
    99+
    2023-06-30
  • Java文件重定向与I/O流的关系是什么?
    在Java编程中,文件重定向和I/O流是两个非常重要的概念。它们之间有着密切的关系,本文将通过详细的解释和演示代码,来探讨Java文件重定向与I/O流的关系。 一、文件重定向 在Linux和Unix系统中,文件重定向是一种常见的操作。通过...
    99+
    2023-09-05
    文件 重定向 load
  • Java实战之基于I/O流设计的图书管理系统
    目录一、前言二、项目介绍三、项目说明四、项目实现五、总结一、前言 当前,我还没有学到数据库相关的知识,想要完全通过Java来完成一个可以存储数据的图书馆管理系统就只能使用I/O流的知...
    99+
    2024-04-02
  • Java中I/O流读取数据不完整的问题解决
    目录一·问题描述:二·问题原因:三·解决办法:四·测试结果:成功一·问题描述: 1.利用Java的转换流去读取一...
    99+
    2024-04-02
  • JAVA中stream流的基础处理方法有哪些
    这篇文章主要介绍了JAVA中stream流的基础处理方法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JAVA中stream流的基础处理方法有哪些文章都会有所收获,下面我们一起来看看吧。Stream流程处...
    99+
    2023-07-05
  • Java基础知识中ByteArrayOutputStream流的使用方法是什么
    Java基础知识中ByteArrayOutputStream流的使用方法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java ByteArrayOutputStream...
    99+
    2023-06-22
  • Java基础知识中StringWriter流的使用方法是什么
    本篇文章为大家展示了Java基础知识中StringWriter流的使用方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java StringWriter流的使用一、StringWriter流...
    99+
    2023-06-22
  • Java开发中需要知道的基础知识有哪些
    这篇文章将为大家详细讲解有关Java开发中需要知道的基础知识有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java 是一个多功能的编程语言,在某种程度上,它用在几乎所有可能涉及计算机的行业了里。Ja...
    99+
    2023-06-02
  • 关于JAVA中stream流的基础处理(获取对象字段和对象批量处理等)
    目录Stream流程处理情况1:按指定字段获取集合对象中的字段:2:按指定字段对集合对象进行排序:3: 按指定字段对集合对象去重处理4: 对集合对象批量处理5: 将集合对象中指定字段...
    99+
    2023-03-24
    java stream stream流 stream流基础
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作