为什么我需要在资源上使用.close()

流形

我知道这可能会被否决,这让我很困扰

我已经阅读了关于.close()方法的所有文章,例如

用Layman的术语解释Java中的close()方法

为什么需要调用close()或shutdown()方法?

close()方法的用法(Java初学者)

我有这些问题似乎太琐碎了

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)

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

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

这一点将针对您打开的任何要写入的文件完成。如果不关闭,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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们需要在 execvp 之前在管道上调用 close?

来自分类Dev

为什么需要在 nodejs 流中完成后调用 close ?

来自分类Dev

为什么即使我在 Java 中使用 close() 方法也会收到“资源泄漏:'<未分配的可关闭值>'”错误?

来自分类Java

为什么要在ResultSet和Connection实例上调用close()?

来自分类Dev

KafkaConsumer.close()为什么?

来自分类Linux

串口挂在close()上

来自分类Dev

什么时候以及为什么我们需要在bash上使用“ wait”命令?

来自分类Java

在close()之前使用flush()

来自分类Dev

为什么我们需要在Linux上挂载?

来自分类Dev

为什么file.close()会使我的代码变慢

来自分类Dev

为什么我的Stage.close无法正常工作

来自分类Dev

为什么Bunifu控件在this.Close()上显示错误

来自分类Java

杰克逊为什么我需要在子类上使用JsonTypeName批注

来自分类Dev

为什么我需要在此React方法上使用这些花括号

来自分类Dev

为什么ByteArrayOutputStream.close()抛出IOException?

来自分类Dev

为什么我需要在 shareReplay 中使用管道?

来自分类Dev

为什么我需要在终端上使用 sudo?

来自分类Dev

为什么我需要在Android中使用super()?

来自分类Dev

为什么我需要在 Django 中使用 SlugField?

来自分类Dev

什么是gvfs,为什么要在我的系统上使用它?

来自分类Dev

UDPConn Close真正做什么?

来自分类Java

为什么在Java的try-with-resources构造中捕获之前调用资源的close()方法?

来自分类Java

为什么不上.close()我的应用程序发布文件,以便他们可以删除?

来自分类Dev

为什么我在file.close()上出现[Errno 9]错误的文件描述符-错误处理

来自分类Dev

直接调用close()与使用ChannelFutureListener.CLOSE之间的区别

来自分类Dev

为什么我要在StatefulWidget上使用StatelessWidget?

来自分类Dev

Android:为什么我们需要在黄油刀上使用R2而不是R?

来自分类Dev

为什么map_async()不需要pool.close()和pool.join()?

来自分类Java

我是否需要处理或忽略OutputStream close()函数触发的IOException?

Related 相关文章

  1. 1

    为什么我们需要在 execvp 之前在管道上调用 close?

  2. 2

    为什么需要在 nodejs 流中完成后调用 close ?

  3. 3

    为什么即使我在 Java 中使用 close() 方法也会收到“资源泄漏:'<未分配的可关闭值>'”错误?

  4. 4

    为什么要在ResultSet和Connection实例上调用close()?

  5. 5

    KafkaConsumer.close()为什么?

  6. 6

    串口挂在close()上

  7. 7

    什么时候以及为什么我们需要在bash上使用“ wait”命令?

  8. 8

    在close()之前使用flush()

  9. 9

    为什么我们需要在Linux上挂载?

  10. 10

    为什么file.close()会使我的代码变慢

  11. 11

    为什么我的Stage.close无法正常工作

  12. 12

    为什么Bunifu控件在this.Close()上显示错误

  13. 13

    杰克逊为什么我需要在子类上使用JsonTypeName批注

  14. 14

    为什么我需要在此React方法上使用这些花括号

  15. 15

    为什么ByteArrayOutputStream.close()抛出IOException?

  16. 16

    为什么我需要在 shareReplay 中使用管道?

  17. 17

    为什么我需要在终端上使用 sudo?

  18. 18

    为什么我需要在Android中使用super()?

  19. 19

    为什么我需要在 Django 中使用 SlugField?

  20. 20

    什么是gvfs,为什么要在我的系统上使用它?

  21. 21

    UDPConn Close真正做什么?

  22. 22

    为什么在Java的try-with-resources构造中捕获之前调用资源的close()方法?

  23. 23

    为什么不上.close()我的应用程序发布文件,以便他们可以删除?

  24. 24

    为什么我在file.close()上出现[Errno 9]错误的文件描述符-错误处理

  25. 25

    直接调用close()与使用ChannelFutureListener.CLOSE之间的区别

  26. 26

    为什么我要在StatefulWidget上使用StatelessWidget?

  27. 27

    Android:为什么我们需要在黄油刀上使用R2而不是R?

  28. 28

    为什么map_async()不需要pool.close()和pool.join()?

  29. 29

    我是否需要处理或忽略OutputStream close()函数触发的IOException?

热门标签

归档