计算 jar 文件条目中的文件数
Count the number of files inside an entry of jar file
我正在寻找一种方法来计算 jar 文件条目中的文件数。
例如,假设我在 jar 中有一个名为“myFolder”的文件夹,我希望能够计算其中的文件数。
我使用了 here 的想法来访问我的文件夹,但我不知道如何访问其中的文件。
这是我的代码:
private int countFiles() {
JarFile jf = null;
int counter = 0;
try {
jf = new JarFile(new File(ClassName.class
.getProtectionDomain().getCodeSource().getLocation().toURI()));
Enumeration<JarEntry> entries = jf.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.isDirectory()) {
if (entry.getName().equals("myFolder/")) {
///////
}
}
}
} catch (Exception ex) {
try {
jf.close();
} catch (Exception e) {
}
}
return counter;
}
感谢帮助!
只有 jar 中的空目录才能通过 isDirectory
测试。
对于文件条目,目录将包含在名称中
shell> import java.util.jar.JarFile;
JarFile jf = new JarFile(new File("test.jar"));
jf ==> java.util.jar.JarFile@32d992b2
jf.stream().forEach(f -> System.out.println(f.getName()))
META-INF/
META-INF/MANIFEST.MF
dir1/Order.MOVED
dir1/Pet.MOVED
dir1/Tag.MOVED
dir1/User.MOVED
empty/
jf.stream().forEach(f -> { if(f.getName().contains("dir1/")) System.out.println(f.getName()) ;})
dir1/Order.MOVED
dir1/Pet.MOVED
dir1/Tag.MOVED
dir1/User.MOVED
jf.stream().forEach(f -> { if(f.getName().contains("dir1/dir2/")) System.out.println(f.getName()) ;})
dir1/dir2/
dir1/dir2/Pet.MOVED
dir1/dir2/Order.MOVED
无需检查是否为目录即可使用
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().contains("myFolder/")) {
///////
}
}
这也应该有效
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (!entry.isDirectory() && entry.getName().startsWith("myFolder/")) {
///////
}
}
如果您想在 Java 中执行此操作,那么使用 NIO2 API 中的 ZIP 文件系统提供程序 可能更容易。
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) throws IOException {
Path jarFile = Path.of("path", "to", "file.jar");
String directoryPath = "/myFolder";
long fileCount = countFilesInDir(jarFile, directoryPath);
System.out.println(fileCount);
}
public static long countFilesInDir(Path jarFile, String directory) throws IOException {
try (FileSystem fs = FileSystems.newFileSystem(jarFile)) {
return Files.list(fs.getPath(directory)).count();
}
}
}
如果你只想计算普通文件那么改变:
return Files.list(fs.getPath(directory)).count();
收件人:
return Files.list(directory).filter(Files::isRegularFile).count();
如果你想递归地计算 entries/files 然后检查 java.nio.file.Files#find(Path,int,BiPredicate,FileVisitOption...)
方法。
注意:通常你应该在完成后关闭Files.list
或Files.find
返回的Stream
,但在这种情况下由于 FileSystem
被关闭,应该被关闭。
我正在寻找一种方法来计算 jar 文件条目中的文件数。
例如,假设我在 jar 中有一个名为“myFolder”的文件夹,我希望能够计算其中的文件数。
我使用了 here 的想法来访问我的文件夹,但我不知道如何访问其中的文件。
这是我的代码:
private int countFiles() {
JarFile jf = null;
int counter = 0;
try {
jf = new JarFile(new File(ClassName.class
.getProtectionDomain().getCodeSource().getLocation().toURI()));
Enumeration<JarEntry> entries = jf.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.isDirectory()) {
if (entry.getName().equals("myFolder/")) {
///////
}
}
}
} catch (Exception ex) {
try {
jf.close();
} catch (Exception e) {
}
}
return counter;
}
感谢帮助!
只有 jar 中的空目录才能通过 isDirectory
测试。
对于文件条目,目录将包含在名称中
shell> import java.util.jar.JarFile;
JarFile jf = new JarFile(new File("test.jar"));
jf ==> java.util.jar.JarFile@32d992b2
jf.stream().forEach(f -> System.out.println(f.getName()))
META-INF/
META-INF/MANIFEST.MF
dir1/Order.MOVED
dir1/Pet.MOVED
dir1/Tag.MOVED
dir1/User.MOVED
empty/
jf.stream().forEach(f -> { if(f.getName().contains("dir1/")) System.out.println(f.getName()) ;})
dir1/Order.MOVED
dir1/Pet.MOVED
dir1/Tag.MOVED
dir1/User.MOVED
jf.stream().forEach(f -> { if(f.getName().contains("dir1/dir2/")) System.out.println(f.getName()) ;})
dir1/dir2/
dir1/dir2/Pet.MOVED
dir1/dir2/Order.MOVED
无需检查是否为目录即可使用
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().contains("myFolder/")) {
///////
}
}
这也应该有效
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (!entry.isDirectory() && entry.getName().startsWith("myFolder/")) {
///////
}
}
如果您想在 Java 中执行此操作,那么使用 NIO2 API 中的 ZIP 文件系统提供程序 可能更容易。
import java.io.IOException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
public class Main {
public static void main(String[] args) throws IOException {
Path jarFile = Path.of("path", "to", "file.jar");
String directoryPath = "/myFolder";
long fileCount = countFilesInDir(jarFile, directoryPath);
System.out.println(fileCount);
}
public static long countFilesInDir(Path jarFile, String directory) throws IOException {
try (FileSystem fs = FileSystems.newFileSystem(jarFile)) {
return Files.list(fs.getPath(directory)).count();
}
}
}
如果你只想计算普通文件那么改变:
return Files.list(fs.getPath(directory)).count();
收件人:
return Files.list(directory).filter(Files::isRegularFile).count();
如果你想递归地计算 entries/files 然后检查 java.nio.file.Files#find(Path,int,BiPredicate,FileVisitOption...)
方法。
注意:通常你应该在完成后关闭Files.list
或Files.find
返回的Stream
,但在这种情况下由于 FileSystem
被关闭,应该被关闭。