当你遇到以下三种情况时,一定要记得使用 .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()内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论