我知道这可能会被否决,这让我很困扰
我已经阅读了关于.close()方法的所有文章,例如
我有这些问题似乎太琐碎了
1.“ resource”一词的确切含义是什么(是文件还是“ 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字符流
可以说resource是下面的FileWriter(因为我还没有获得资源的含义)
JVM启动并打开所谓的资源,然后执行完成,然后在执行后关闭JVM
2.它解锁由于它运行不正确而打开的资源(如果我错了请纠正我)
G:/>
此时,JVM没有运行
3.在关闭之前,垃圾收集器被称为对吗?(如果错了,请纠正我),这样FileWriter对象将被销毁,那么为什么要关闭所有已打开的资源
和
4.再次,我读到“资源泄漏”,这应该是什么意思..?
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));
}
}
该代码打开一千个文件进行写入。
假设您打开的文件数限制为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()
)中执行此操作,则操作系统也不知道是否可以释放内存等,并将其用于其他请求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句