当前位置: 首页 > 面试题库 >

如果不手动关闭流,何时关闭?

刘安志
2023-03-14
问题内容

我想知道如果不手动关闭流,何时关闭。我的意思是,如果引用的范围不再存在,流将被关闭吗?

请考虑以下示例方案。

Class A{
 InputStream in;
 OutputStream out;
 A(){
  // Initialize and create the streams.
 }
 ...
}
Class B{
 public void myMethod(){
 A a = new A();
 System.out.println("End of my method.")
 }
...
}

在这里,一旦完成流处理,我将退出,myMethod()但是反过来将继续执行该程序的程序不会终止,而是继续进行其他操作。

我没有关闭溪流。一旦对A类的引用范围结束,它会自动关闭吗?(即何时myMethod()结束)?GC会照顾吗?另外,我读到,一旦流程结束,流将关闭,并且系统释放为其他进程保留的所有资源。我们如何检查流是否打开?Java是否提供任何Linux命令或选项来进行检查?

任何帮助表示赞赏!


问题答案:

我认为JVM规范对此不做任何保证。您确实应该finally关闭这些资源。

该过程结束时,操作系统将释放与其相关的所有资源(包括内存,文件句柄和网络套接字)。

有OS设施可以检查打开的文件和流,例如lsof



 类似资料:
  • 问题内容: 我有一个包装,其中包含一些表单输入,并保存数据并关闭。 我有,并且我的回调函数已执行,但是我看不到手动关闭叠加层的方法。我正在尝试使用Bootstrap 中的属性(可预测)不起作用。 问题答案: 向该元素添加一个ref,并在呈现元素后调用该方法。尚未测试,但应该可以工作:

  • 我想做的是:打开大文件的InputStream,读取10MB的块,上传一个块,读取下一个块。 我为这个任务编写了很好的代码,但问题是ContentResolver返回ParcelFileDescriptor。AutoCloseInputStream作为InputStriam。这个实现打破了InputStream的契约,因为它在first.read()之后自动关闭,所以当我尝试读取下一个块时,我得到

  • 问题内容: 我是hibernate的新手,在阅读了hibernateapi和教程之后,似乎该会话在不使用时应关闭。 像这样: 在独立应用程序中使用它时,我没有问题。但是我不确定在Web应用程序中使用时。 例如,我有一个servlet:从客户端接收参数,然后调用Manager来根据参数查询内容,如下所示: 我应该使用查询方法关闭会话吗? 由于有人告诉我,hibernate中的会话就像jdbc中的连接

  • 我不想更改端口号,但收到异常“exception in thread”main“java.net.BindException:Address already in use:JVM_Bind” ServerSocket服务器=新服务器套接字(1234180);

  • 假设我使用的是一个文档不完整的第三方库,它没有源代码。库的方法之一接受来加载各种数据。 不幸的是,Java规范(据我所知)没有提到如果在try-with-resource中手动关闭资源会发生什么。有没有人碰巧知道?

  • 我正在尝试用PDFBOX填充重复的表单。我正在使用树状图并用单个记录填充表单。pdf表格的格式是在第一页列出六个记录,在第二页插入一个静态页。(对于大于6条记录的树映射,该过程重复)。Im获得的错误与TreeMap的大小有关。这就是我的问题所在。我不明白为什么当我用35个以上的条目填充TreeMap时,我会得到以下警告: 2018年4月23日2:36:25 AM org.apache.pdfbox