我怎么能用Java压缩文件而不包括文件路径

例如,我想压缩存储在/Users/me/Desktop/image.jpg中的文件

我做了这个方法:

public static Boolean generateZipFile(ArrayList sourcesFilenames, String destinationDir, String zipFilename){ // Create a buffer for reading the files byte[] buf = new byte[1024]; try { // VER SI HAY QUE CREAR EL ROOT PATH boolean result = (new File(destinationDir)).mkdirs(); String zipFullFilename = destinationDir + "/" + zipFilename ; System.out.println(result); // Create the ZIP file ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFullFilename)); // Compress the files for (String filename: sourcesFilenames) { FileInputStream in = new FileInputStream(filename); // Add ZIP entry to output stream. out.putNextEntry(new ZipEntry(filename)); // Transfer bytes from the file to the ZIP file int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } // Complete the entry out.closeEntry(); in.close(); } // Complete the ZIP file out.close(); return true; } catch (IOException e) { return false; } } 

但是当我解压缩文件时,解压缩的文件具有完整路径。

我不希望zip中每个文件的完整路径只需要文件名。

我该怎么做?

这里:

 // Add ZIP entry to output stream. out.putNextEntry(new ZipEntry(filename)); 

您正在使用整个路径为该文件创建条目。 如果您只使用名称(没有路径),您将拥有所需的名称:

 // Add ZIP entry to output stream. File file = new File(filename); //"Users/you/image.jpg" out.putNextEntry(new ZipEntry(file.getName())); //"image.jpg" 

您正在使用文件的相对路径找到源数据,然后将Entry设置为相同的东西。 相反,您应该将源转换为File对象,然后使用

putNextEntry(new ZipEntry(sourceFile.getName()))

那只会给你路径的最后一部分(即实际的文件名)

如杰森所说 ,或者如果你想保留你的方法签名,那就这样做:

 out.putNextEntry(new ZipEntry(new File(filename).getName())); 

或者,使用apache commons / io中的FileNameUtils.getName :

 out.putNextEntry(new ZipEntry(FileNameUtils.getName(filename))); 

您可能可以通过新的FileInputStream(新文件(sourceFilePath,sourceFileName))来访问源文件。

 // easy way of zip a file 

import java.io. *;

 import java.util.zip.*; public class ZipCreateExample{ public static void main(String[] args) throws Exception { // input file FileInputStream in = new FileInputStream("F:/ZipCreateExample.txt");; // out put file ZipOutputStream out =new ZipOutputStream(new FileOutputStrea("F:/tmp.zip")); // name of file in zip folder out.putNextEntry(new ZipEntry("zippedfile.txt")); byte[] b = new byte[1024]; int count; // writing files to new zippedtxt file while ((count = in.read(b)) > 0) { System.out.println(); out.write(b, 0, count); } out.close(); in.close(); } } 
 try { String zipFile = "/locations/data.zip"; String srcFolder = "/locations"; File folder = new File(srcFolder); String[] sourceFiles = folder.list(); //create byte buffer byte[] buffer = new byte[1024]; /* * To create a zip file, use * * ZipOutputStream(OutputStream out) constructor of ZipOutputStream * class. */ //create object of FileOutputStream FileOutputStream fout = new FileOutputStream(zipFile); //create object of ZipOutputStream from FileOutputStream ZipOutputStream zout = new ZipOutputStream(fout); for (int i = 0; i < sourceFiles.length; i++) { if (sourceFiles[i].equalsIgnoreCase("file.jpg") || sourceFiles[i].equalsIgnoreCase("file1.jpg")) { sourceFiles[i] = srcFolder + fs + sourceFiles[i]; System.out.println("Adding " + sourceFiles[i]); //create object of FileInputStream for source file FileInputStream fin = new FileInputStream(sourceFiles[i]); /* * To begin writing ZipEntry in the zip file, use * * void putNextEntry(ZipEntry entry) method of * ZipOutputStream class. * * This method begins writing a new Zip entry to the zip * file and positions the stream to the start of the entry * data. */ zout.putNextEntry(new ZipEntry(sourceFiles[i].substring(sourceFiles[i].lastIndexOf("/") + 1))); /* * After creating entry in the zip file, actually write the * file. */ int length; while ((length = fin.read(buffer)) > 0) { zout.write(buffer, 0, length); } /* * After writing the file to ZipOutputStream, use * * void closeEntry() method of ZipOutputStream class to * close the current entry and position the stream to write * the next entry. */ zout.closeEntry(); //close the InputStream fin.close(); } } //close the ZipOutputStream zout.close(); System.out.println("Zip file has been created!"); } catch (IOException ioe) { System.out.println("IOException :" + ioe); } 

如果您压缩两个具有相同名称但具有不同路径的文件,则会遇到重复的文件输入错误。