使用gunzip的ProcessBuilder不起作用

时间:2013-05-05 13:41:47

标签: java processbuilder gunzip

我正在尝试使用注释运行此代码失败:

  

gzip:/home/idob/workspace/DimesScheduler/*.gz:没有这样的文件或目录

代码:

ProcessBuilder gunzipPB = new ProcessBuilder("gunzip", System.getProperty("user.dir") + File.separator + "*");
gunzipPB.inheritIO();
int gunzipProcessExitValue;

try {
        gunzipProcessExitValue = gunzipPB.start().waitFor();
    } catch (InterruptedException | IOException e) {
        throw new RuntimeException("Service " + this.getClass().getSimpleName() + " could not finish creating WHOIS AS Prefix Table", e);
    }

logger.info("Finished unzipping radb and ripe files. Process exit value : {}", gunzipProcessExitValue);

退出值为1。

终端中的相同命令工作正常(文件存在)。

可能是什么问题?

感谢。

修改

尝试使用DirectoryStrem后,我收到此异常: java.nio.file.NoSuchFileException: /home/idob/workspace/DimesScheduler/*.gz

知道可能是什么问题吗?文件确实存在。

完整代码:

ProcessBuilder radbDownloadPB = new ProcessBuilder("wget", "-q", "ftp://ftp.radb.net    /radb/dbase/*.db.gz");
ProcessBuilder ripeDownloadPB = new ProcessBuilder("wget", "-q", "ftp://ftp.ripe.net/ripe/dbase/split/ripe.db.route.gz"); 

    radbDownloadPB.inheritIO();
    ripeDownloadPB.inheritIO(); 

    try {

        int radbProcessExitValue = radbDownloadPB.start().waitFor();
        logger.info("Finished downloading radb DB files. Process exit value : {}", radbProcessExitValue);

        int ripeProcessExitValue = ripeDownloadPB.start().waitFor();
        logger.info("Finished downloading ripe DB file. Process exit value : {}", ripeProcessExitValue);

        // Unzipping the db files - need to process each file separately since java can't do the globing of '*'  
        try (DirectoryStream<Path> zippedFilesStream = Files.newDirectoryStream(Paths.get(System.getProperty("user.dir"), "*.gz"))){
            for (Path zippedFilePath : zippedFilesStream) {
                ProcessBuilder gunzipPB = new ProcessBuilder("gunzip", zippedFilePath.toString());
                gunzipPB.inheritIO();
                int gunzipProcessExitValue = gunzipPB.start().waitFor();
                logger.debug("Finished unzipping file {}. Process exit value : {}", zippedFilePath, gunzipProcessExitValue);
            }
        }

        logger.info("Finished unzipping ripe and radb DB file");

    } catch (InterruptedException | IOException e) {
        throw new RuntimeException("Service " + this.getClass().getSimpleName() + " could not finish creating WHOIS AS Prefix Table", e);
    }

...谢谢

1 个答案:

答案 0 :(得分:1)

*.gz glob不是由gunzip命令处理的,而是shell。例如,shell会将gunzip *.gz翻译为gunzip a.gz b.gz。现在,当您通过java执行时,您必须调用bash为您执行globbing,或者在java中展开glob,因为gzip不知道如何处理glob。

Java 7具有new libraries,这使得扩展的glob模式更容易。