Jarring基于扩展名的目录中的所有文件

问题描述 投票:1回答:2

我正在尝试使用Java使用Java命令jar文件夹中的所有文件,如下所示,

jar -cvf /Abhishek/logs.jar my_directory/logs/*.logs*

我正在使用Java来执行此操作。

String cmd[] = {"jar", "-cvf", "/Abhishek/logs.jar", "my_directory/logs/*.logs*"};
pb = Runtime.getRuntime().exec(cmd);

但只有清单存放在罐子里。

added manifest

当我提取jar文件时,我收到了清单文件。所以我对此表示怀疑

*log.*

是否允许使用这种语法?因为它在终端中工作正常。

有人会对此有所了解吗?

谢谢。

java bash shell jar sh
2个回答
1
投票

在Linux上,文件通配由shell完成。因此,当您在终端输入*.log时,shell会将其扩展为匹配文件列表。然后将其传递给该程序。

如果直接执行程序,则必须自己扩展模式。或者你可以让shell使用类似的命令执行它

String cmd[] = {"sh", "-c", "jar -cvf /Abhishek/logs.jar my_directory/logs/*.logs*"};

0
投票

您可能只想在jar命令使用的java.util.jar package中使用相同的类。这将避免第二个Java进程,并将避免依赖shell扩展:

try (JarOutputStream jar = new JarOutputStream(
        new BufferedOutputStream(
            Files.newOutputStream(
                Paths.get("/Abhishek/logs.jar"))));
    DirectoryStream<Path> dir = Files.newDirectoryStream(
        Paths.get("my_directory/logs"), "*.logs*")) {

    for (Path file : dir) {
        BasicFileAttributes attr =
            Files.readAttributes(file, BasicFileAttributes.class);

        String name = file.toString();
        if (attr.isDirectory()) {
            name = name + "/";
        }

        JarEntry entry = new JarEntry(name);
        entry.setLastModifiedTime(attr.lastModifiedTime());
        entry.setLastAccessTime(attr.lastAccessTime());
        entry.setCreationTime(attr.creationTime());
        entry.setSize(attr.size());

        jar.putNextEntry(entry);
        Files.copy(file, jar);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.