java FileNotFoundException 打开的文件太多

标签 java file file-io io copy

我正在尝试用 Java 构建一个自动备份脚本。虽然我不太擅长 Java,但事实证明这很困难。

这是我的代码:

package javatest;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Main {   
 public static void main(String[] args) throws Exception {
      String path = "/mnt/192.168.1.89";
      String destFile = "/home/scott/backup.zip";

      zip(path,destFile);
 }

 private static void zip(String src, String destFile) throws Exception
 {
     FileOutputStream fileWriter = new FileOutputStream(destFile);
     ZipOutputStream zip = new ZipOutputStream(fileWriter);

     addFolderToZip("", src, zip);

     zip.flush();
     zip.close();
 }

 private static void addFolderToZip(String path, String srcFolder, ZipOutputStream zip) throws Exception
 {
       File folder = new File(srcFolder);

       for (String filename : folder.list())
       {
            if (path.equals("")) {
                 addFileToZip(folder.getName(), srcFolder + "/" + filename, zip);
            } else {
                 addFileToZip(path + "/" + folder.getName(), srcFolder + "/" + filename, zip);
            }
       }
 }

 private static void addFileToZip(String path, String srcFile, ZipOutputStream zip) throws Exception
 {
     File folder = new File(srcFile);

     if (folder.isDirectory()) {
          addFolderToZip(path,srcFile,zip);
     } else {
          byte[] buf = new byte[1024];

          int len;

          FileInputStream in = new FileInputStream(srcFile);

          zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));

          while((len = in.read(buf)) > 0)
          {
               zip.write(buf,0,len);
          }
     }
 }
}

这里是异常(exception):

Exception in thread "main" java.io.FileNotFoundException: FILENAME (Too many open files)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:106)
    at java.io.FileInputStream.<init>(FileInputStream.java:66)
    at javatest.Main.addFileToZip(Main.java:53)
    at javatest.Main.addFolderToZip(Main.java:37)
    at javatest.Main.addFileToZip(Main.java:47)
    at javatest.Main.addFolderToZip(Main.java:37)
    at javatest.Main.addFileToZip(Main.java:47)
    at javatest.Main.addFolderToZip(Main.java:37)
    at javatest.Main.addFileToZip(Main.java:47)
    at javatest.Main.addFolderToZip(Main.java:37)
    at javatest.Main.addFileToZip(Main.java:47)
    at javatest.Main.addFolderToZip(Main.java:37)
    at javatest.Main.addFileToZip(Main.java:47)
    at javatest.Main.addFolderToZip(Main.java:37)
    at javatest.Main.addFileToZip(Main.java:47)
    at javatest.Main.addFolderToZip(Main.java:37)
    at javatest.Main.addFileToZip(Main.java:47)
    at javatest.Main.addFolderToZip(Main.java:35)
    at javatest.Main.zip(Main.java:22)
    at javatest.Main.main(Main.java:14)
Java Result: 1

最佳答案

确保你close()你的:

  • ZipOutputStream(您这样做是对的),以及
  • 文件输入流

现在,您的流中有许多打开的连接。

addFolderToZip() 方法中,像这样在最后关闭你的 FileInputStream:

try {
    in.close();
} catch (IOException e) {
    //Log exception
}

关于java FileNotFoundException 打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6268112/

相关文章:

java - 从不相关的方法调用 super 方法

Java读取第n行

c# - 文件夹重命名后的文件存在检查在 UNC 共享上返回不正确的值

android - 文件存在测试对缓存文件夹不起作用...?

Javascript顺序打印到文件

php - UPLOAD_ERR_INI_SIZE 错误,但 post_max_size 和 upload_max_filesize 值看起来正确

c++ - 阻止通过 ifstream 对象从 FIFO 读取

java - 在 IntelliJ IDEA 中哪里可以找到已弃用方法的替代方法?

java - Android Activity list 错误

java - 如何使用camel删除超过几天的文件夹