Java 子处理额外输出到控制台
Java subprocess extra output to console
我编写了一个 java 程序,它启动子进程(通过 ProcessBuilder
)并在不同的线程中处理它们的 I/O(Process.getInputStream(),Process.getErrorStream(),Process.getOutputStream()
)流.
我的 java-程序作为服务器工作,我不希望子进程向控制台输出额外的信息,并且
在 IDE 的控制台中它工作正常,但是如果我尝试从 windows 或 linux 控制台 运行 程序 java -jar ...
,子进程将输出写入我的程序和控制台。
P.S。我从 java 执行 Python 脚本文件,例如我的 python 脚本打印测试字符串 "Hello World" 1000 次。
我的程序处理得很好,但我也在控制台中看到它的输出。
是否有某种 "console" 我需要以某种方式从进程中分离出来?
更新:
这里我得到了一个用于 运行 宁 python 的 ProcessBuilder(我将脚本的目录作为参数传递):
private ProcessBuilder getBuilder(File directory) {
return new ProcessBuilder("python", "-u").directory(directory);
}
这里我从构建器开始一个流程,return它进一步处理(
我将脚本的目录和参数传递给脚本):
public Process execute(Path dir, String... args) {
if (!Files.exists(dir) || !Files.isDirectory(dir))
throw new IllegalArgumentException("Provided path " + dir + " is not a directory or doesn't exist");
ProcessBuilder builder = getBuilder(dir.toFile());
if (args.length > 0) {
builder.command().addAll(Arrays.asList(args));
}
try {
return builder.start();
} catch (IOException io) {
io.printStackTrace();
return null;
}
}
这是一个测试哑脚本:
i=0;
while True:
if i%1000000==0:
print ('Hello, world!')
i+=1
我不知道 post 我的流处理程序是否有意义,因为它们看起来像其他主题中的标准 gobbler,但它们从进程 out/error 读取到队列并获取输入来自另一个队列,java 程序处理队列并且除了记录器消息外没有输出到控制台。
但似乎子进程本身会写入控制台,但也许我错了。
我没有找到如何以编程方式执行此操作。
对我有帮助的唯一方法是在启动 jar 文件时将输出重定向到 /dev/null。
挺合适的,因为我也是通过网络获取到客户端的输出。
我编写了一个 java 程序,它启动子进程(通过 ProcessBuilder
)并在不同的线程中处理它们的 I/O(Process.getInputStream(),Process.getErrorStream(),Process.getOutputStream()
)流.
我的 java-程序作为服务器工作,我不希望子进程向控制台输出额外的信息,并且
在 IDE 的控制台中它工作正常,但是如果我尝试从 windows 或 linux 控制台 运行 程序 java -jar ...
,子进程将输出写入我的程序和控制台。
P.S。我从 java 执行 Python 脚本文件,例如我的 python 脚本打印测试字符串 "Hello World" 1000 次。 我的程序处理得很好,但我也在控制台中看到它的输出。
是否有某种 "console" 我需要以某种方式从进程中分离出来?
更新:
这里我得到了一个用于 运行 宁 python 的 ProcessBuilder(我将脚本的目录作为参数传递):
private ProcessBuilder getBuilder(File directory) {
return new ProcessBuilder("python", "-u").directory(directory);
}
这里我从构建器开始一个流程,return它进一步处理( 我将脚本的目录和参数传递给脚本):
public Process execute(Path dir, String... args) {
if (!Files.exists(dir) || !Files.isDirectory(dir))
throw new IllegalArgumentException("Provided path " + dir + " is not a directory or doesn't exist");
ProcessBuilder builder = getBuilder(dir.toFile());
if (args.length > 0) {
builder.command().addAll(Arrays.asList(args));
}
try {
return builder.start();
} catch (IOException io) {
io.printStackTrace();
return null;
}
}
这是一个测试哑脚本:
i=0;
while True:
if i%1000000==0:
print ('Hello, world!')
i+=1
我不知道 post 我的流处理程序是否有意义,因为它们看起来像其他主题中的标准 gobbler,但它们从进程 out/error 读取到队列并获取输入来自另一个队列,java 程序处理队列并且除了记录器消息外没有输出到控制台。
但似乎子进程本身会写入控制台,但也许我错了。
我没有找到如何以编程方式执行此操作。 对我有帮助的唯一方法是在启动 jar 文件时将输出重定向到 /dev/null。 挺合适的,因为我也是通过网络获取到客户端的输出。