我如何在 Java 中压缩文件而不包含文件路径
Posted
技术标签:
【中文标题】我如何在 Java 中压缩文件而不包含文件路径【英文标题】:How can i zip files in Java and not include files paths 【发布时间】:2011-03-02 09:46:01 【问题描述】:例如,我想压缩存储在 /Users/me/Desktop/image.jpg 中的文件
我做了这个方法:
public static Boolean generateZipFile(ArrayList<String> 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 中每个文件的完整路径,我只想要文件名。
我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:这里:
// 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"
【讨论】:
【参考方案2】:您正在使用文件的相对路径查找源数据,然后将条目设置为相同的内容。相反,您应该将源转换为 File 对象,然后使用
putNextEntry(new ZipEntry(sourceFile.getName()))
这将为您提供路径的最后部分(即实际文件名)
【讨论】:
【参考方案3】:做as Jason said,或者如果你想保留你的方法签名,这样做:
out.putNextEntry(new ZipEntry(new File(filename).getName()));
或者,使用来自 apache commons/io 的 FileNameUtils.getName:
out.putNextEntry(new ZipEntry(FileNameUtils.getName(filename)));
【讨论】:
【参考方案4】:您可能可以get away 通过 new FileInputStream(new File(sourceFilePath, sourceFileName)) 访问源文件。
【讨论】:
【参考方案5】:// easy way of zip a file
导入 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();
【讨论】:
【参考方案6】: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);
【讨论】:
【参考方案7】:但是,如果您压缩两个同名但路径不同的文件,则会遇到重复的文件输入错误。
【讨论】:
以上是关于我如何在 Java 中压缩文件而不包含文件路径的主要内容,如果未能解决你的问题,请参考以下文章