如何使用java仅压缩.txt文件

时间:2015-01-19 08:00:06

标签: java

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());
    }
}
}

我尝试使用此代码来压缩文件,它显示文件名但不压缩它们。我是否应该添加任何内容..并且它显示代码中的错误继续编译?

帮我解决这个问题

2 个答案:

答案 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)

巴勒特, 请粘贴您看到的错误消息

另外,我发现您的方法存在一些问题。 您可能需要执行以下操作

  • 从for循环中取出FOS和ZOS的定义并将其移到它上面......
  • 缺少添加文件的代码......
  • 在for循环后移动zos.close()
  • 您可以使用以下代码将文本文件的内容添加到ZipOutputStream

/**
* 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
     }
 }