【问题标题】:Need to count the number of files located within each zip file in a directory folder in JAVA需要计算 JAVA 目录文件夹中每个 zip 文件中的文件数
【发布时间】:2021-02-24 21:48:59
【问题描述】:

我有一个文件夹,其中包含一系列 Zip 文件。我正在尝试遍历文件夹并计算每个 zip 文件中的文件数。我已经创建了两段代码,我只是不确定如何将它们放在一起以获得我想要的结果。两个代码都放在 try/catch 块中,它们都可以完美地独立工作。这是使用 Eclipse,用 Java 编写的。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.zip.ZipFile;
import java.io.File;
import java.util.List;
 
public class KZF {
 
       public static void main(String[] args) {
             // TODO Auto-generated method stub
 
             // Try/Catch Block counts the number of files within a given zip file
             try {
 
                    ZipFile zipFile = new ZipFile(
                           "C:\\Users\\username\\Documents\\Temp\\AllKo\\Policy.zip");
 
                    int NumberOfFiles = zipFile.size() - 1;
                    // String name = zipFile.getName();
                    Path path = Paths
                           .get("C:\\Users\\username\\Documents\\Temp\\AllKo\\Policy.zip");
                    Path filename = path.getFileName();
 
                    System.out.print("The number of files in: ");
                    // System.out.print(name);
                    System.out.print(filename.toString());
                    System.out.print(" are: ");
                    System.out.print(NumberOfFiles + " file(s)");
 
                    zipFile.close();
 
             }
 
             catch (IOException ioe) {
 
                    System.out.println("Error opening zip file" + ioe);
             }
 
             // ----------------------------------------------------------------------------------------------------------
             // Creates list of every file specified folder
 
             
              String dirLocation = "C:\\Users\\username\\Documents\\Temp\\AllKo";
             
               try { List<File> files = Files.list(Paths.get(dirLocation))
              .map(Path::toFile) .collect(Collectors.toList());
             
               files.forEach(System.out::println);
             
               } catch(IOException e) { Error }
             
 
       }
 
}

【问题讨论】:

  • 对 ZIP 文件中的文件进行计数的第一部分可能应该是一个单独的方法,带有 Path 参数和 int 返回类型,然后您从循环中调用目录中的 ZIP 文件.但请注意,ZipFile.size() 返回条目数,ZIP 文件也可能包含目录(即非文件)条目。另外调用Files.list(...).collect(...) 不会关闭由Files.list(...) 创建的Stream 另请参阅stackoverflow.com/q/26997240;您必须使用 try-with-resources 和 Files.list(...) 作为资源。

标签: java file directory path zip


【解决方案1】:

你必须小心打开/关闭流,所以你可以尝试这样的事情:

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Enumeration;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class KZF
{
    static int findNumberOfFiles(File file) {
        try (ZipFile zipFile = new ZipFile(file)) {
            return zipFile.stream().filter(z -> !z.isDirectory()).count();
        } catch (Exception e) {
            return -1;
        }
    }

    static String createInfo(File file) {
        int tot = findNumberOfFiles(file);
        return (file.getName() + ": " + (tot >= 0 ? tot + " files" : "Error reading zip file"));
    }

    public static void main(String[] args) throws IOException {
        String dirLocation = "C:\\Users\\username\\Documents\\Temp\\AllKo";
        try (Stream<Path> files = Files.list(Paths.get(dirLocation))) {
            files
            .filter(path -> path.toFile().isFile())
            .filter(path -> path.toString().toLowerCase().endsWith(".zip"))
            .map(Path::toFile)
            .map(KZF::createInfo)
            .forEach(System.out::println);
        }
    }
}

【讨论】:

  • 你好。感谢您的帮助。我尝试了这段代码,但是在测试时,它适用于某些 zip 文件,但对于其他文件,它输出的文件数量不正确。你知道是什么导致了这个问题吗?
  • 尝试用显示文件类型和名称的循环替换“zipfile.stream().filter....”,让它只适用于错误评估的 zip 文件。例如。枚举 e = zipFile.entries() int i=0; while (e.hasMoreElements()) { ZipEntry entry = e.nextElement(); System.out.println(entry.isDirectory()? "D:": "F:"+entry.getName());我++; } 返回我;
  • 非常感谢!这确实奏效了。但现在我有另一个问题。打印的计数需要放入 Microsoft SQL 服务器的数据库表中。您认为最简单的方法是什么?
  • @JsohLearner 有很多方法:您可以使用像 Hibernate 和/或 Spring 和/或 JPA 等 ORM 等。如果您需要快速&肮脏的方法,只需使用低级JPA 方法。有关详细信息,请参阅docs.oracle.com/javaee/5/tutorial/doc/bnbpz.html。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 2011-12-27
  • 2017-11-14
  • 1970-01-01
  • 2015-07-05
  • 2022-07-21
  • 2023-01-02
  • 1970-01-01
相关资源
最近更新 更多