2012-01-26 83 views
2

在此代码:Java - 是否需要关闭“新的FileInputStream”?

Properties prop = new Properties(); 
prop.load(new FileInputStream("config.properties")); 

加载某些属性,但确实FileInputStream中需要关闭或者它以某种方式采取的是自己照顾自己?

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

我也想知道,如果我创建一个变量,说,String a = nullint b; 他们在没有任何东西时会消耗内存吗?

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

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

+3

请将它们分成多个问题:)。你也可以搜索并找到他们在别处回答。 –

+0

流问题已回答,有人可以回答记忆吗? 它可能在线,但它通常以一些愚蠢和复杂的方式编写。我宁愿有人exlplaining – user1021085

回答

1

流:是。 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 
} 

看起来没有什么发生,除了初始化我的主类。

然后,我改变了代码的说:

int a = 1; 
String s = ""; 

汇编,反编译,并得到:

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 
} 

你可以清楚地看到,在“主”的方法,该内存的相关补充规定分配。

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

1

是的,你一定要自己关闭流。 林这里指的是Java文档: click! 它说

指定的流保持此方法返回后开放。

1

关闭InputStreams总是会更好(如果不是某些时间点,那些会被GCed,但我们不知道什么时候会这样,这可能会导致很多问题)。

String a = null and int b 

当你像上面定义的那样在String情况下没有分配内存。

0

这是一个很大的问题,在一个问题:)

流应该始终被关闭,这很多答案已经为example

3

JVM可能会快速垃圾回收并关闭FileInputStream。在一个小脚本中,这样做很好。然而,规范成语云:

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

至于变量,每个变量是一个参考,并且将占用8个字节的存储器,即使它存储任何内容(整数通常只占用4个字节,和布尔值是偶数更优化,但这些都是特例)。一旦声明离开作用域,这些本地引用将不占用内存(因为它们的堆栈空间已经消失),但是创建的任何对象都将存在,直到它们被垃圾收集为止。

+0

这不会complie。 'fis = ...'必须在外面试试,是的 – bestsss

+0

不确定你使用的编译器是什么?这绝对是正确的语法,并在OpenJDK和SunJDK中编译。如果不用'FileInputStream fis = null;' – stefan

+0

进行初始化,某些版本可能会抱怨关闭流也会刷新其内容,因此即使小脚本也应该关闭流以确保所有内容都被写入磁盘(也可以直接调用flush()作品)。 – josefx