为什么我需要在资源

时间:2016-05-24 09:16:32

标签: java methods resources filewriter

我知道这可能会得到一次投票,这让我很烦恼

我已经阅读过.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;这应该是什么意思..?

1 个答案:

答案 0 :(得分:3)

resource表示JVM和/或操作系统为您提供所请求功能所需的任何内容。

采取你的榜样。如果您打开一般FileWriter操作系统(取决于操作系统,文件系统等)将会执行(假设您要将文件写入光盘,如HDD / SDD)

  1. 为请求的文件名创建目录条目
  2. 创建数据结构以维护文件的写入过程
  3. 如果您实际将数据写入文件
  4. ,则分配磁盘空间

    (注意:这不是一个详尽的清单)

    对于您打开写入的任何文件,都将完成这一点。如果你没有关闭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()),操作系统也不知道是否可以释放内存等并用于其他请求。