Java-Does";“新建文件输入流”;需要关门吗?

Java-Does";“新建文件输入流”;需要关门吗?,java,Java,在此代码中: Properties prop = new Properties(); prop.load(new FileInputStream("config.properties")); 某些属性已加载,但fileinputstream是否需要关闭,或者它是否以某种方式自行处理 我是否需要创建一个变量,即新文件inputstream,然后关闭该变量 我还想知道,我是否创建了一个变量,比如,stringa=null和intb; 当他们什么都不持有时,他们会消耗内存吗 如果我在一个方法或循环中

在此代码中:

Properties prop = new Properties();
prop.load(new FileInputStream("config.properties"));
某些属性已加载,但fileinputstream是否需要关闭,或者它是否以某种方式自行处理

我是否需要创建一个变量,即新文件inputstream,然后关闭该变量

我还想知道,我是否创建了一个变量,比如,
stringa=null
intb
; 当他们什么都不持有时,他们会消耗内存吗

如果我在一个方法或循环中有它,它在超出范围时是否仍然消耗内存


我想有人曾经说过它被加载到内存中,但不是“活动的”?

是的,你肯定需要自己关闭这个流。 我这里指的是java文档: 上面说

此方法返回后,指定的流保持打开状态


关闭输入流总是更好的(如果不是某个时间点,这些将被GCed,但我们不知道什么时候会被GCed,这可能会导致很多问题)


当您定义类似上面的内容时,内存不会以字符串大小写分配。

一个问题中有很多问题:)


流应该总是关闭的,很多关于这一点的答案已经在流中给出了:是。Java没有析构函数,因此对象无法自行清理。在垃圾收集时(终结器)会进行一些清理,但依赖于此并不是好的编程实践

Java中存在“finally”块的原因之一是负责资源释放

内存分配:看起来没有。我创建了以下程序:

public class deleteme
{
    public static void main( String[] args )
    {
        int a;
        String s;
    }

}
编译它,然后使用javap-c反编译,得到:

public class deleteme {
  public deleteme();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: return
}
已编译、反编译并获得:

public class deleteme {
  public deleteme();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: ldc           #2                  // String
       4: astore_2
       5: return
}
公共类deleteme{
公共删除me();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:iconst_1
1:istore_1
2:ldc#2//String
4:astore_2
5:返回
}
在分配内存的“main”方法中,您可以清楚地看到附加指令


我有一种感觉,不同版本的Java编译器可能会以不同的方式处理此问题。

JVM可能会快速进行垃圾收集并关闭FileInputStream。在小脚本中,这样做很好。然而,经典的成语是:

FileInputStream fis;
try {
    fis = new FileInputStream("config.properties");
    prop.load(fis);
} finally {
    fis.close();
}

至于变量,每个变量都是一个引用,即使它不存储任何内容,也会占用8字节的内存(int通常只占用4字节,boolean更优化,但这些都是特殊情况)。一旦声明离开作用域,这些本地引用将不占用内存(因为它们的堆栈空间已用完),但您创建的任何对象都将存在,直到它们被垃圾回收。

请将这些对象拆分为多个问题:)。你也可以在别处搜索并找到答案。流问题得到了回答,有人能回答记忆问题吗?它可能是在线的,但它通常是用一些愚蠢而复杂的方式写的。我希望有人能解释这件事
fis=…
必须在外部尝试,是的不确定您使用的编译器是什么?这绝对是正确的语法,可以在OpenJDK和SunJDK中编译。如果不使用
FileInputStream fis=null初始化,某些版本可能会抱怨关闭流也会刷新其内容,因此即使是小脚本也应该关闭流,以确保所有内容都写入磁盘(直接调用flush()也可以)。我同意在小脚本中使用此习惯用法,但JVM在完成流时会调用close,这也会刷新流,所以这不是问题(这里更不是问题,因为它是一个输入流;)@stefan jvm在退出之前不会运行终结器,因此在短脚本中使用时不会刷新流。系统类使用runFinalizersOnExit方法来解决此行为,但它已被弃用(线程问题)。正如您指出的,这对于InputStreams不是问题
public class deleteme {
  public deleteme();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: ldc           #2                  // String
       4: astore_2
       5: return
}
FileInputStream fis;
try {
    fis = new FileInputStream("config.properties");
    prop.load(fis);
} finally {
    fis.close();
}