Java中的.close()举例详解

2025-09-30 01:50
文章标签 java 详解 举例 close

本文主要是介绍Java中的.close()举例详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的....

当你遇到以下三种情况时,一定要记得使用 .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’,因为这个对象是根据“ScaChina编程nner”这个类创造出来的,所以它的类是“Scanner”,长按“Ctr”鼠标放在“Scanner"上面,查看它的声明中有没有有没有 implements AutoCloseable 或者 implements Closeable?

Java中的.close()举例详解

  • ➡️ 如果【没有】

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

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

  • ➡️ 如果【有】

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

    • 例子: 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):程序默认的错误信息专http://www.chinasem.cn出口通道。在Jav编程China编程a里,它就是 System.err,也通常连接到屏幕

  • ➡️ 如果【不是】

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

    • 解释:&www.chinasem.cnnbsp;这个资源是由你的代码主动“借用”的,

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

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

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

    • 看得见的行为:通常使用 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()内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Java中的.close()举例详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156107

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程