Java中的.close()举例详解

 更新时间:2025年09月29日 11:15:20   作者:超级大只老咪  
.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,这篇文章主要介绍了Java中的.close()的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

当你遇到以下三种情况时,一定要记得使用 .close():

1.操作文件

2.访问网络

3.连接数据库

用法

.close()是一种方法,所以一般是 对象.close()来调用的

作用

.close() 的作用就是释放程序占用的外部资源(如文件、网络连接),把它们“还给”操作系统,以避免资源浪费和程序崩溃。

个人理解:.close() 的本质是“有借有还”。当你向操作系统“借用”了一个外部资源(比如打开一个文件),你就有责任在用完后通过 .close() 归还它。

举例

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
    Scanner input = new Scanner(System.in);
    String i = input.nextLine();
    int a = Integer.parseInt(i);
    System.out.println(a);
    }
}

这是一个简单的实现输入功能的代码,就以这个代码举例(之前发过一个“Java如何实现输出”里面有详细讲解)

如何判断代码中的 input 对象要不要用到 .close()?

我们可以遵循一个简单的两步判断流程:

第一步:查看对象的类定义(是否声明有implements AutoCloseable或 implements Closeable)

示例代码中对象为‘input’,因为这个对象是根据“Scanner”这个类创造出来的,所以它的类是“Scanner”,长按“Ctr”鼠标放在“Scanner"上面,查看它的声明中有没有有没有 implements AutoCloseable 或者 implements Closeable?

  • ➡️ 如果【没有】

    • 结论: 流程结束。绝对不需要 .close()。

    • 例子: ArrayList, String, HashMap 等。它们不管理外部资源,所以没有这个“资格”。

  • ➡️ 如果【有】

    • 结论: 这个对象有资格被关闭。它是一个需要被严肃对待的资源对象。请继续第二步判断。

    • 例子: Scanner, FileInputStream, Socket, Connection 等。

第二步:“关闭”是我的责任吗?

只有通过了第一步的对象,才需要进行这一步的审查。

  • 操作: 看你是如何创建这个对象的。

  • 提问: 创建这个对象时,它所管理的核心资源是不是 System.in、System.out 或 System.err 这三个“全局共享”资源?

  • ➡️ 如果【是】

    • 结论: 流程结束。绝对不要 .close()!

    • 解释: 你正在操作一个“预设资源”,用专业术语来讲就是“标准I/O流”,它是在你程序运行前,就由环境预先设置好的,不是由你自己写代码动态创建的”。所以关闭的责任属于Java虚拟机(JVM),不属于你。关闭它会引发严重问题。

  • 小知识:什么是“标准I/O流”?
    • “标准I/O流”(Standard I/O Streams)是计算机领域的一个基础概念,你可以把它理解为程序与外界沟通的三条默认通道

    • 标准输入 (Standard Input):程序默认的数据来源通道。在Java里,它就是 System.in,通常连接到键盘

    • 标准输出 (Standard Output):程序默认的正常信息出口通道。在Java里,它就是 System.out,通常连接到屏幕

    • 标准错误 (Standard Error):程序默认的错误信息专用出口通道。在Java里,它就是 System.err,也通常连接到屏幕

  • ➡️ 如果【不是】

    • 结论: 流程结束。你必须 .close() 它!

    • 解释: 这个资源是由你的代码主动“借用”的,

      如何识别“主动借用”的资源?

      所谓主动“借用”,就是指你的代码从无到有地创建了一个通往外部特定目标的连接

      你可以通过以下两个非常明显的代码特征来识别这个动作:

    • 看得见的行为:通常使用 new 关键字。
      当你写下 new FileInputStream(...) 或 new Socket(...) 时,这个 new 的动作本身就是在告诉操作系统:“请为我创建一个全新的、到外部资源的连接。” 这与直接使用已经存在的 System.in 完全不同。

    • 明确的目标:需要你提供一个具体的“地址”。
      在创建时,你必须指定一个目标,比如一个文件名 ("data.txt")、一个网址 ("example.com") 或一个数据库地址。这个“地址”参数就是一个强烈的信号,表明你正在操作一个程序外部的、需要“借用”才能访问的资源。

    • 所以当你用 new 创建一个需要“地址”的资源对象时,你就是在“借用”它,关闭的责任也自然落在了你的身上

    • 最佳实践: 立即使用 try-with-resources 语法来确保它被自动、安全地关闭。

import java.io.File;
import java.util.Scanner;

// 从文件读取,就必须关闭
try (Scanner fileScanner = new Scanner(new File("data.txt"))) {
    while (fileScanner.hasNextLine()) {
        System.out.println(fileScanner.nextLine());
    }
} catch (FileNotFoundException e) {
    System.err.println("文件未找到!");
}
// 当 try 块结束时,fileScanner 会被自动、安全地关闭
    • 例如:

      • new FileInputStream("文件名")

      • new Socket("网址", 端口)

      • dataSource.getConnection()

      • new Scanner(new File("文件名")) 

总结

到此这篇关于Java中的.close()的文章就介绍到这了,更多相关Java中.close()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Spring框架注解扫描开启之配置细节

    详解Spring框架注解扫描开启之配置细节

    本篇文章主要介绍了详解Spring框架注解扫描开启之配置细节,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java中main函数的String[] args用法举例详解

    Java中main函数的String[] args用法举例详解

    这篇文章主要给大家介绍了关于Java中main函数的String[] args用法的相关资料,JAVA类中main函数的参数String[] args指的是运行时给main函数传递的参数,文中通过图文以及代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Java输出多位小数的三种方法(附代码)

    Java输出多位小数的三种方法(附代码)

    这篇文章主要给大家介绍了关于Java输出多位小数的三种方法的相关资料,在实际工作中常常需要设定数字的输出格式,如以百分比的形式输出,或者设定小数位数等,需要的朋友可以参考下
    2023-07-07
  • hibernate4基本配置方式详解

    hibernate4基本配置方式详解

    这篇文章给大家带来了hibernate4基本配置方式,非常不错,具有参考借鉴价值,需要的额朋友参考下吧
    2017-09-09
  • SpringBoot整合MybatisPlus的基本应用详解

    SpringBoot整合MybatisPlus的基本应用详解

    MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生,本文将给大家介绍一下SpringBoot整合MybatisPlus的基本应用,需要的朋友可以参考下
    2024-05-05
  • Java中的WeakHashMap详解

    Java中的WeakHashMap详解

    这篇文章主要介绍了Java中的WeakHashMap详解,WeakHashMap可能平时使用的频率并不高,但是你可能听过WeakHashMap会进行自动回收吧,下面就对其原理进行分析,需要的朋友可以参考下
    2023-09-09
  • 一文解决pom.xml报错Dependency "xxx" not found的问题

    一文解决pom.xml报错Dependency "xxx" not f

    我们在使用maven进行jar包管理时有时会遇到pom.xml中报错Dependency “XXX” not found,所以在本文中将给大家介绍一下pom.xml报错Dependency "xxx" not found的解决方案,需要的朋友可以参考下
    2024-01-01
  • SpringBoot注入静态属性或静态对象的方法

    SpringBoot注入静态属性或静态对象的方法

    我们在使用SpringBoot为一些静态属性或者静态对象注入时会发现注入不成功,我们可以以下这几种方式把需要注入的值注入到静态属性中,感兴趣的朋友一起看下
    2024-12-12
  • SpringMVC中处理Ajax请求的示例

    SpringMVC中处理Ajax请求的示例

    本篇文章给大家介绍SpringMVC中处理Ajax请求的示例,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Java 浅复制和深复制的实例详解

    Java 浅复制和深复制的实例详解

    这篇文章主要介绍了Java 浅复制和深复制的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08

最新评论