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

输入/输出流是否在销毁时关闭?

闾丘坚诚
2023-03-14
问题内容

Java中的InputStreams和OutputStreams是否在销毁时关闭()?我完全理解这可能是错误的形式(尤其是在C和C
++世界中),但是我很好奇。

另外,假设我有以下代码:

private void foo()
{
    final string file = "bar.txt";
    Properties p = new Properties();
    p.load( new FileInputStream(file) );
    //...
}

无名的FileInputStream是否在p.load()之后超出范围,并因此被破坏,就像C
++范围规则一样?我尝试在Google上搜索Java的匿名变量范围,但这并没有达到我的预期。

谢谢。


问题答案:

第一个答案:在Java中没有“破坏”(在C
++的意义上)之类的东西。只有垃圾收集器,当看到准备好收集的对象时,它可能会唤醒也可能不会唤醒并完成其工作。Java中的GC通常是不可信的。

第二个答案:有时是,有时不是,但不值得冒险。来自Elliote Rusty Harold的 Java
IO

并非所有流都需要关闭-
例如,字节数组输出流不需要关闭。但是,与文件和网络连接关联的流在使用完后应始终关闭。例如,如果您打开一个文件进行写入,而在浏览过程中却忽略了该文件,则可能会阻止其他进程读取或写入该文件。

根据Harold的说法,输入或输出流也是如此。有一些例外情况(他注意到System.in),但是总的来说,如果您在完成后不关闭文件流,则会冒着一定的风险。并在finally块中关闭它们,以确保即使抛出异常也将它们关闭。



 类似资料:
  • 主要内容:C++输入流和输出流本教程一开始就提到,C++ 又可以称为“带类的 C”,即可以理解为 C++ 是 C 语言的基础上增加了面向对象(类和对象)。在此基础上,学过 C 语言的读者应该知道,它有一整套完成数据读写(I/O)的解决方案: 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕上输出数据; 使用 fscanf()、fgets() 等函数读取文件中的数据,使

  • 本小节将会介绍基本输入输出的 Java 标准类,通过本小节的学习,你将了解到什么是输入和输入,什么是流;输入输出流的应用场景,File类的使用,什么是文件,Java 提供的输入输出流相关 API 等内容。 1. 什么是输入和输出(I / O) 1.1 基本概念 输入/输出这个概念,对于计算机相关专业的同学并不陌生,在计算中,输入/输出(Input / Output,缩写为 I / O)是信息处理系

  • 今天早些时候很无聊,我开始思考Java中缓冲和非缓冲字节流的相对性能。作为一个简单的测试,我下载了一个相当大的文本文件,并编写了一个简短的程序来确定缓冲流在复制文件时的效果。进行了四项测试: 使用无缓冲的输入和输出字节流复制文件 毫不奇怪,使用缓冲输入和输出流比使用无缓冲流快几个数量级。然而,真正有趣的事情(至少对我来说)是案例2和案例3之间的速度差异。部分样本结果如下: 对于那些感兴趣的人,可以

  • 我想用java代码调用一个外部程序,然后Google告诉我Runtime或ProcessBuilder可以帮助我完成这项工作。我试过了,结果发现java程序无法退出,这意味着子进程和父进程都将永远等待。它们要么挂起,要么陷入僵局。 有人告诉我原因是子进程的缓存太小了。当它试图将数据返回给父进程时,但是父进程没有及时读取它,然后他们两个都挂起了。所以他们建议我叉一个线程来负责读取子进程的缓存数据。我

  • 问题内容: 我在try / catch块中有以下代码 我的问题是,当我必须在finally块中关闭这些流时,是否必须关闭所有3个流,或者仅关闭 befferedreader 会关闭所有其他流? 问题答案: 按照惯例,包装流(用于包装现有流)在关闭时会关闭基础流,因此仅在示例中必须关闭。而且,关闭已经关闭的流通常是无害的,因此关闭所有3个流都不会受到伤害。

  • 问题内容: 我创建了一个基于会话的简单登录页面。 并添加了一个包含此内容的注销页面 现在,当我关闭浏览器/页面并重新打开它时,会话的值仍然存在。 我想知道如何完全销毁页面/浏览器关闭上的会话。 问题答案: 如果您使用: 关闭浏览器时,您的会话cookie将会被破坏…因此,在关闭浏览器之前,您的会话将是良好的。IE浏览器 您登录并登录,然后关闭浏览器,然后重新打开,再次进入该站点,您将不会登录。