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();
}