package codes;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Rough {
public static void main(String[] args) throws IOException {
private static final String FOLDER_PATH = "C:\\Users\\s13w63\\Desktop\\Zip";
File dir = new File(FOLDER_PATH);
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File directory, String fileName) {
if (fileName.endsWith(".txt")) {
return true;
}
return false;
}
});
for (File f : files)
{
FileOutputStream fos=new FileOutputStream("C:\\Users\\s13w63\\Desktop\\Source.zip");
ZipOutputStream zos=new ZipOutputStream(fos);
ZipEntry ze=new ZipEntry(f.getCanonicalPath());
zos.putNextEntry(ze);
zos.close();
System.out.println(f.getCanonicalPath());
}
}
}
我尝试使用此代码来压缩文件,它显示文件名但不压缩它们。我是否应该添加任何内容..并且它显示代码中的错误继续编译?
帮我解决这个问题
答案 0 :(得分:6)
使用java.nio.file;它有一个非常好的解决方案来解决你的问题。
插图:
final Path zipPath = Paths.get("C:\\Users\\s13w63\\Desktop\\Source.zip");
final Path dir = Paths.get("C:\\Users\\s13w63\\Desktop\\Zip");
final DirectoryStream<Path> dirstream
= Files.newDirectoryStream(dir, "*.txt");
final URI uri = URI.create("jar:" + zipPath.toUri());
final Map<String, ?> env = Collections.emptyMap();
String filename;
try (
final FileSystem zipfs = FileSystems.newFileSystem(uri, env);
) {
for (final Path entry: dirstream) {
filename = dir.relativize(entry).toString();
Files.copy(entry, zipfs.getPath("/" + filename));
}
}
是的,没错,你可以打开一个FileSystem
的zip文件;因此,Files
中的每个操作都可以“拉上拉链”使用!
这是JSR 203给你;你甚至在内存,FTP,Dropbox和其他方面都有FileSystem
个实现。
请注意将文件名称设为String
的必要性:这是因为如果另一个.resolve()
来自另一个Path
,则不能Path
{{1}}对另一个{{1}}供应商;我已经发布了一个解决这个特殊问题的软件包(包括其他内容),对于这种情况有一个MorePaths.resolve()
method。
答案 1 :(得分:2)
巴勒特, 请粘贴您看到的错误消息
另外,我发现您的方法存在一些问题。 您可能需要执行以下操作
/** * Adds a file to the current zip output stream * * @param file * the file to be added * @param zos * the current zip output stream */
private static void addFileToZip(File file, ZipOutputStream zos) { try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) { zos.putNextEntry(new ZipEntry(file.getName())); byte[] bytesIn = new byte[BUFFER_SIZE]; int read = 0;while ((read = bis.read(bytesIn)) != -1) { zos.write(bytesIn, 0, read); } zos.closeEntry(); } catch (IOException e) { //Take appropriate action } }