FileInputStream fis = ....
try{
       for(int i=0;i<100;i++){
           fis = new FileInputStream(...);
       }
   }finally{
      try{
          fis.close();
 }catch(...){
     .....
 }
   }在这个程序中fis只需要关闭一次对吗?产生的100个流中前99个都被GC回收了,是吧?

解决方案 »

  1.   

    把for放在外面for(int i=0;i<100;i++){
    try{
       fis = new FileInputStream(...);
    }catch(Exception e){
    }finally{
      try{
     fis.close();}catch(Exception e){}
    }
    ]
      

  2.   


    只是最后一次关闭了,前99个在全部在内存 等待回收 ,不是都被回收。楼主还是把 fis.close() 写在 for 循环内比较稳妥!!
      

  3.   

    我想法和楼主差不多我觉得让垃圾回收 就可以了package com.jungle;import java.io.FileInputStream;
    import java.io.FileNotFoundException;public class Test {
    public static void main(String[] args) throws FileNotFoundException { System.out.println(Integer.MAX_VALUE); long start = System.currentTimeMillis();
    FileInputStream fis = null;
    try {
    for (int i = 0; i < 2147483647; i++) { fis = new FileInputStream(
    "E:/Workspaces/MyEclipse 9/TestCsdn/src/com/jungle/CopyOfTest.java"); }
    } finally {
    try {
    if (fis != null)
    fis.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    System.out.println(System.currentTimeMillis() - start); start = System.currentTimeMillis();
    for (int i = 0; i < 2147483647; i++) {
    try {
    fis = new FileInputStream(
    "E:/Workspaces/MyEclipse 9/TestCsdn/src/com/jungle/CopyOfTest.java");
    } finally {
    try {
    if (fis != null)
    fis.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    } System.out.println(System.currentTimeMillis() - start);
    }
    }
      

  4.   


    打开任务管理器
    我在我的PC机上 运行了十分钟 没有看见内存有变过 都是 占用769MB -- 767MB只见少 不见多神奇吧?!~ 少应该是我关了几个窗口 所以 不要没试验就下结论。
      

  5.   

    流跟jdbc那里的statement等一样,都属于稀缺资源,虽然等到最后垃圾回收机制会处理,但毕竟不是实时的,这些资源的过度占用将导致内存溢出、最终系统崩溃。
    建议用完就关,而且创建一个关一个,楼主应该将关闭动作放在for循环里面。
      

  6.   

    GC是在内存将满时执行回收动作,所以我觉得如果让GC处理这些已经没有引用对象的流,会比每次关闭流更有效率一些,还有就是执行清理动作后的流是处于等待回收的状态呢,还是立即释放了它的内存空间了?