我知道这可能会得到一次投票,这让我很烦恼
我已经阅读过.close()方法的所有帖子,如
explain the close() method in Java in Layman's terms
Why do I need to call a close() or shutdown() method?
the usage of close() method(Java Beginner)
我有这些看似太微不足道的问题
1.“资源”这个词是什么?完全意味着(是文件还是' FileWriter'对象还是其他东西)(尝试尽可能广泛地解释)
让我们考虑以下代码
import java.io.*;
public class characterstreams
{
public static void main(String []args) throws Exception
{
File f=new File("thischaracter.txt");
FileWriter fw=new FileWriter(f);
char[] ch={'a','c','d'};
fw.write('a');
fw.write(ch);
fw.write("aaaa aaaaa aaaaaaa");
fw.flush();
FileReader fr=new FileReader(f);
int r=fr.read();
System.out.println(r);
char[] gh=new char[30];
System.out.println(fr.read(gh));
}
}
编译并执行后
G:/> java characterstreams
假设资源是下面的FileWriter(因为我还没有得到资源的含义)
JVM启动并打开所谓的资源,然后执行完成,之后JVM在执行后关闭
2.解锁已打开的资源,因为它没有正常运行(如果我错了,请纠正我)
G:/>
此时JVM未运行
3.在shuting之前,垃圾收集器被称为对吗?(如果错误则纠正我)因此FileWriter对象被破坏 那么我们为什么要关闭我们开辟的所有资源
和
4.我认为资源被泄露了#39;这应该是什么意思..?
答案 0 :(得分:3)
resource
表示JVM和/或操作系统为您提供所请求功能所需的任何内容。
采取你的榜样。如果您打开一般FileWriter
操作系统(取决于操作系统,文件系统等)将会执行(假设您要将文件写入光盘,如HDD / SDD)
(注意:这不是一个详尽的清单)
对于您打开写入的任何文件,都将完成这一点。如果你没有关闭resource
,那么所有这些都会留在内存中,并且仍由操作系统维护。
假设您的应用程序运行了很长时间并且不断打开文件。操作系统允许您保持打开的打开文件数量有限(具体数量取决于操作系统,配额设置,......)。如果资源耗尽,某些事情将出现意外或失败。
在下面找到Linux上的小型演示。
public static void main(String[] args) throws IOException {
List<OutputStream> files = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
files.add(Files.newOutputStream(Paths.get("/tmp/demo." + i),
StandardOpenOption.CREATE));
}
}
代码打开一个thousend文件进行写作。
假设您打开文件的限制为1024
ulimit -n
1024
您运行代码段,它将生成1000个文件/tmp/demo.*
。
如果您的打开文件限制仅为100,则代码将失败
ulimit -n 100
java.nio.file.FileSystemException: /tmp/demo.94: Too many open files
(之前由于JVM本身有一些打开的文件而失败)
要防止此类问题(缺少资源),您应该关闭不再需要写入的文件。如果不使用Java(close()
),操作系统也不知道是否可以释放内存等并用于其他请求。