用Java创建Zip文件夹中的文件夹

我的任务要求我将文件目录保存到zip文件夹中。 我唯一的问题是我需要将子文件夹保存为主目录中的文件夹。 文件系统看起来像

C\\Friends C:\\Friends\\Person1\\Information.txt C:\\Friends\\Person2\\Information.txt C:\\Friends\\Person3\\Information.txt 

。 。 。

现在我只能在我的zip文件夹中写入txt文件,但在我的zip文件夹中,我需要保留该文件夹结构。 我知道我的代码现在的方式会告诉我我正在尝试写的文件是关闭的(无法访问)。 到目前为止我的职能:

 private String userDirectroy = "" //This is set earlier in the program public void exportFriends(String pathToFile) { String source = pathToFile + ".zip"; try { String sourceDir = userDirectory; String zipFile = source; try { FileOutputStream fout = new FileOutputStream(zipFile); ZipOutputStream zout = new ZipOutputStream(fout); File fileSource = new File(sourceDir); addDirectory(zout, fileSource); zout.close(); System.out.println("Zip file has been created!"); } catch(Exception e) { } } catch(Exception e) { System.err.println("First Function: " + e); } } private static void addDirectory(ZipOutputStream zout, File fileSource) { File[] files = fileSource.listFiles(); System.out.println("Adding directory " + fileSource.getName()); for(int i=0; i  0) { zout.write(buffer, 0, length); } } catch(Exception e) { System.err.println(e); } addDirectory(zout, files[i]); continue; } try { System.out.println("Adding file " + files[i].getName()); //create byte buffer byte[] buffer = new byte[1024]; //create object of FileInputStream FileInputStream fin = new FileInputStream(files[i]); zout.putNextEntry(new ZipEntry(files[i].getName())); int length; while((length = fin.read(buffer)) > 0) { zout.write(buffer, 0, length); } zout.closeEntry(); //close the InputStream fin.close(); } catch(IOException ioe) { System.out.println("IOException :" + ioe); } } } 

任何帮助将非常感激。 谢谢

对于每个文件夹,您需要添加路径的空ZipEntry

对于每个文件,您需要提供路径和文件名。 这将要求您知道要剥离的路径部分,这将是启动目录之后的所有内容

扩展的概念

因此,从您的示例中,如果起始目录是C:\Friends ,那么C:\Friends\Person1\Information.txt的条目应该看起来像Person1\Information.txt

 public void exportFriends(String pathToFile) { String source = pathToFile + ".zip"; try { String sourceDir = "C:/Friends"; String zipFile = source; try { FileOutputStream fout = new FileOutputStream(zipFile); ZipOutputStream zout = new ZipOutputStream(fout); File fileSource = new File(sourceDir); addDirectory(zout, sourceDir, fileSource); zout.close(); System.out.println("Zip file has been created!"); } catch (Exception e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } public static String getRelativePath(String sourceDir, File file) { // Trim off the start of source dir path... String path = file.getPath().substring(sourceDir.length()); if (path.startsWith(File.pathSeparator)) { path = path.substring(1); } return path; } private static void addDirectory(ZipOutputStream zout, String sourceDir, File fileSource) throws IOException { if (fileSource.isDirectory()) { // Add the directory to the zip entry... String path = getRelativePath(sourceDir, fileSource); if (path.trim().length() > 0) { ZipEntry ze = new ZipEntry(getRelativePath(sourceDir, fileSource)); zout.putNextEntry(ze); zout.closeEntry(); } File[] files = fileSource.listFiles(); System.out.println("Adding directory " + fileSource.getName()); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { addDirectory(zout, sourceDir, files[i]); } else { System.out.println("Adding file " + files[i].getName()); //create byte buffer byte[] buffer = new byte[1024]; //create object of FileInputStream FileInputStream fin = new FileInputStream(files[i]); zout.putNextEntry(new ZipEntry(getRelativePath(sourceDir, files[i]))); int length; while ((length = fin.read(buffer)) > 0) { zout.write(buffer, 0, length); } zout.closeEntry(); //close the InputStream fin.close(); } } } }