java FileNotFoundException Too many open files

10,559

Solution 1

Make sure you close() both your:

  • ZipOutputStream (which you rightly did so), and
  • FileInputStream

Right now, there's many open connections in your streams.

in addFolderToZip() method, close your FileInputStream at the end like so:

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

Solution 2

close those streams best practice is to do it in try-finally blocks like so (finally blocks are nearly always executed when the try block exits

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

     addFolderToZip("", src, zip);

     zip.flush();
   }finally{
     if(zip!=null)zip.close();//close also does a flush
     if(fileWriter!=null)fileWriter.close();
   }
 }

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 = null;
          try{
              in = new FileInputStream(srcFile);
              zip.putNextEntry(new ZipEntry(path + "/" + folder.getName()));

              while((len = in.read(buf)) > 0)
              {
                   zip.write(buf,0,len);
              }
          }finally{if(in!=null)in.close()}//<<--ensure in is closed you forgot this in the example code
     }
 }
Share:
10,559
CrazeD
Author by

CrazeD

Updated on June 19, 2022

Comments

  • CrazeD
    CrazeD almost 2 years

    I'm trying to build an automatic backup script in Java. I'm not very good at Java though so this is proving difficult.

    Here's my code:

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

    And here's the 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
    
  • mre
    mre almost 13 years
    ZipOutputStream is being closed.
  • Buhake Sindi
    Buhake Sindi almost 13 years
    @mre, yes, but not the FileOutputStream.
  • mre
    mre almost 13 years
    by closing the ZipOutputStream, you implicitly close the FileOutputStream.