Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在使用ProcessBuilder时未启动GZIP命令_Java_Processbuilder - Fatal编程技术网

Java在使用ProcessBuilder时未启动GZIP命令

Java在使用ProcessBuilder时未启动GZIP命令,java,processbuilder,Java,Processbuilder,我肯定有GZIP安装在我正在尝试的盒子上。但是当我在Java中运行这个程序时,我看不到正在创建压缩文件。我正在处理的文件是一个非常大的文件,我不想把它读入内存。下面是我为此编写的代码。我的直觉是它与重定向有关 try { ProcessBuilder builder = new ProcessBuilder("gzip", "-9", "<", filename, ">", zippedFilename); builder.start(); } catch (IOEx

我肯定有
GZIP
安装在我正在尝试的盒子上。但是当我在Java中运行这个程序时,我看不到正在创建压缩文件。我正在处理的文件是一个非常大的文件,我不想把它读入内存。下面是我为此编写的代码。我的直觉是它与重定向有关

try {
    ProcessBuilder builder = new ProcessBuilder("gzip", "-9", "<", filename, ">", zippedFilename);
    builder.start();
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
试试看{
ProcessBuilder=new ProcessBuilder(“gzip”、“-9”、”、zippedFilename);
builder.start();
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}

首先,值得注意的是,您可以通过避免外部进程并使用Java进行压缩来简化这一过程:

Path input = Paths.get(filename);
Path zipped = Paths.get(zippedFilename);

try (OutputStream out = new GZIPOutputStream(
    new BufferedOutputStream(
        Files.newOutputStream(zipped)))) {

    Files.copy(input, out);
}
这具有完全多平台的额外优势。不需要/usr/bin/gzip,也不需要在Windows上使用Unix工具。它不会实现
-9
选项,但我会检查使用该选项实际获得的额外压缩量,并权衡是否值得使用一个可移植性较差的程序

对于其他命令(或者如果
-9
非常重要),ProcessBuilder命令无法通过
重定向输入和输出,原因与C程序无法通过以下调用完成重定向相同:

/* Does not work. */
execl("/usr/bin/gzip", "gzip", "-9", "<", filename, ">", zippedFilename, (char *)NULL);
实际上,只需一个参数即可使shell运行
gzip
-9
。然后shell读取
文件名
,并将其传递给gzip程序进程的标准输入描述符。类似地,shell从同一个gzip程序调用中捕获标准输出,并将其写入
filename.gz

在这种情况下,gzip进程不知道它的输入来自何处,也不知道它的输出去了何处。它只是从自己的标准输入读取数据,然后写入标准输出

当您直接调用程序时,您绕过了shell,因此对
没有特殊处理。这意味着您当前的ProcessBuilder命令与此Unix命令等效:

gzip -9 '<' filename '>' filename.gz

调用Inheritario()将导致外部进程的标准错误(即任何错误消息)出现在Java程序的标准错误上。如果没有这一点,您将无法了解程序失败的原因。(如果我们没有重定向标准输入和标准输出,也可以这样做。)

首先,值得注意的是,您可以通过避免外部进程和使用Java进行压缩来简化这一过程:

Path input = Paths.get(filename);
Path zipped = Paths.get(zippedFilename);

try (OutputStream out = new GZIPOutputStream(
    new BufferedOutputStream(
        Files.newOutputStream(zipped)))) {

    Files.copy(input, out);
}
这具有完全多平台的额外优势。不需要/usr/bin/gzip,也不需要在Windows上使用Unix工具。它不会实现
-9
选项,但我会检查使用该选项实际获得的额外压缩量,并权衡是否值得使用一个可移植性较差的程序

对于其他命令(或者如果
-9
非常重要),ProcessBuilder命令无法通过
重定向输入和输出,原因与C程序无法通过以下调用完成重定向相同:

/* Does not work. */
execl("/usr/bin/gzip", "gzip", "-9", "<", filename, ">", zippedFilename, (char *)NULL);
实际上,只需一个参数即可使shell运行
gzip
-9
。然后shell读取
文件名
,并将其传递给gzip程序进程的标准输入描述符。类似地,shell从同一个gzip程序调用中捕获标准输出,并将其写入
filename.gz

在这种情况下,gzip进程不知道它的输入来自何处,也不知道它的输出去了何处。它只是从自己的标准输入读取数据,然后写入标准输出

当您直接调用程序时,您绕过了shell,因此对
没有特殊处理。这意味着您当前的ProcessBuilder命令与此Unix命令等效:

gzip -9 '<' filename '>' filename.gz

调用Inheritario()将导致外部进程的标准错误(即任何错误消息)出现在Java程序的标准错误上。如果没有这一点,您将无法了解程序失败的原因。(如果我们没有重定向标准输入和标准输出,它也会这样做。)

您可以尝试
ProcessBuilder(“/bin/sh”、“-c”、“gzip-9<“+filename+”>”+zippedFilename)
你使用的是什么操作系统?我假设你没有一个名为
的文件,KevinO的回答是:
文件重定向不是
gzip
的功能。它们由shell(
/bin/sh
)完成,如果您直接启动
gzip
,它们将不起作用。如果文件路径包含空格或shell认为特殊的任何字符,KevinO的建议将不起作用。改用ProcessBuilder的重定向。(顺便说一句,因此您根本不需要外部进程。)您可以尝试
ProcessBuilder(“/bin/sh”、“-c”、“gzip-9<“+filename+”>”+zippedFilename)
你使用的是什么操作系统?我假设你没有一个名为
的文件,KevinO的回答是:
文件重定向不是
gzip
的功能。它们由shell(
/bin/sh
)完成,如果您直接启动
gzip
,它们将不起作用。如果文件路径包含空格或shell认为特殊的任何字符,KevinO的建议将不起作用。改用ProcessBuilder的重定向。(顺便说一句,你根本不需要外部流程。)