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
Make sure you close()
both your:
ZipOutputStream
(which you rightly did so), andFileInputStream
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
}
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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With