我现在有个问题:问题简易代码        InputStream in = null;
        File file = null;
        byte[] b = null;
        String urls[] = new String[]{"E:\\\\nice\\ss.txt","E:\\\\nice\\dd.txt"};
        try {
            for(int i=0;i<urls.length;i++){
                file = new File(urls[i]);
                in = new FileInputStream(file);
                in.read(b);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }finally{
            try {
                in.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
我现在要对一个文件夹下的所有文件(假设所有文件都为txt)进行读写操作,我用的是for循环,我想问的是io流要在for里面关闭吗?如不在for循环里关闭在for外面关闭会不会对文件有所影响,比如留下文件句柄,请解释原因,还有假如文件很多的情况下,"E:\\\\nice\\ss.txt"所对应的in会在执行后面文件操作(for循环内)的时候被回收资源吗?

解决方案 »

  1.   

    请参考:http://www.blogjava.net/dreamer/archive/2007/06/27/dreamer.htmlimport java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.File;public class ReadFile {
      public ReadFile() {}  /**
       * 删除某个文件夹下的所有文件夹和文件
       * @param delpath String
       * @throws FileNotFoundException
       * @throws IOException
       * @return boolean
       */
      public static boolean deletefile(String delpath) throws FileNotFoundException,
          IOException {
        try {      File file = new File(delpath);
          if (!file.isDirectory()) {
            System.out.println("1");
            file.delete();
          }
          else if (file.isDirectory()) {
            System.out.println("2");
            String[] filelist = file.list();
            for (int i = 0; i < filelist.length; i++) {
              File delfile = new File(delpath + "\\" + filelist[i]);
              if (!delfile.isDirectory()) {
                System.out.println("path=" + delfile.getPath());
                System.out.println("absolutepath=" + delfile.getAbsolutePath());
                System.out.println("name=" + delfile.getName());
                delfile.delete();
                System.out.println("删除文件成功");
              }
              else if (delfile.isDirectory()) {
                deletefile(delpath + "\\" + filelist[i]);
              }
            }
            file.delete();      }    }
        catch (FileNotFoundException e) {
          System.out.println("deletefile()   Exception:" + e.getMessage());
        }
        return true;
      }  /**
       * 删除某个文件夹下的所有文件夹和文件
       * @param delpath String
       * @throws FileNotFoundException
       * @throws IOException
       * @return boolean
       */
      public static boolean readfile(String filepath) throws FileNotFoundException,
          IOException {
        try {      File file = new File(filepath);
          if (!file.isDirectory()) {
            System.out.println("文件");
            System.out.println("path=" + file.getPath());
            System.out.println("absolutepath=" + file.getAbsolutePath());
            System.out.println("name=" + file.getName());      }
          else if (file.isDirectory()) {
            System.out.println("文件夹");
            String[] filelist = file.list();
            for (int i = 0; i < filelist.length; i++) {
              File readfile = new File(filepath + "\\" + filelist[i]);
              if (!readfile.isDirectory()) {
                System.out.println("path=" + readfile.getPath());
                System.out.println("absolutepath=" + readfile.getAbsolutePath());
                System.out.println("name=" + readfile.getName());
               
              }
              else if (readfile.isDirectory()) {
                readfile(filepath + "\\" + filelist[i]);
              }
            }      }    }
        catch (FileNotFoundException e) {
          System.out.println("readfile()   Exception:" + e.getMessage());
        }
        return true;
      }  public static void main(String[] args) {
        try {
          readfile("D:/file");
          //deletefile("D:/file");
        }
        catch (FileNotFoundException ex) {
        }
        catch (IOException ex) {
        }
        System.out.println("ok");
      }}
      

  2.   

    一般这样,当你读文件时候,要么是输出这个文件内容,要么是其他的处理,比如重定向。这些东西都是放在for循环里做。for循环结束之后,再去关闭流。当然,这是完整的流程,不排除你在达到一定目的后,马上就关闭流。这种情况就可以再for循环里关闭流。其实和你想要干什么有关系,如果你要处理整个文件,一般都是在for循环之后关闭流。(其实也可以在for循环时判断是否到达文件尾,如果到达了,也可以关了。)
      

  3.   

    b还是个空指针,你读会报错的。in.read(b)//跟定义b的长度有关系。至于在哪关闭没什么影响,看具体情况了。至于回收资源,都是在缓冲区操作的,不需要你考虑。