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的重定向。(顺便说一句,你根本不需要外部流程。)