相关疑难解决方法(0)

ProcessBuilder:转发stdout和stderr启动进程而不阻塞主线程

我正在使用ProcessBuilder在Java中构建一个进程,如下所示:

ProcessBuilder pb = new ProcessBuilder()
        .command("somecommand", "arg1", "arg2")
        .redirectErrorStream(true);
Process p = pb.start();

InputStream stdOut = p.getInputStream();
Run Code Online (Sandbox Code Playgroud)

现在我的问题如下:我想捕获通过该进程的stdout和/或stderr的任何内容,并将其重定向到System.out异步.我希望进程及其输出重定向在后台运行.到目前为止,我发现这样做的唯一方法是手动生成一个新的线程,该线程将连续读取stdOut,然后调用适当的write()方法System.out.

new Thread(new Runnable(){
    public void run(){
        byte[] buffer = new byte[8192];
        int len = -1;
        while((len = stdOut.read(buffer)) > 0){
            System.out.write(buffer, 0, len);
        }
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

虽然这种方法很有效,但感觉有点脏.最重要的是,它为我提供了一个正确管理和终止的线程.有没有更好的方法来做到这一点?

java processbuilder

88
推荐指数
5
解决办法
9万
查看次数

如何将进程输出管道传输到Windows和JDK 6u45上的文件

我有以下Windows批处理文件(run.bat):

@echo off
echo hello batch file to sysout
Run Code Online (Sandbox Code Playgroud)

以下java代码,它运行批处理文件并将输出重定向到文件:

public static void main(String[] args) throws IOException {
    System.out.println("Current java version is: " + System.getProperty("java.version"));

    ProcessBuilder pb =
            new ProcessBuilder("cmd.exe", "/c",
                    "run.bat"
                     ,">>", "stdout.txt","2>>", "stderr.txt"
                    );
    System.out.println("Command is: " + pb.command());

    Process proc = pb.start();

    InputStream in = proc.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));

    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

    int exitValue = proc.exitValue();
    System.out.println("Exit value: " + exitValue);
}
Run Code Online (Sandbox Code Playgroud)

在JDK上,包括JDK6u43,我得到以下输出:

Current …
Run Code Online (Sandbox Code Playgroud)

java jdk1.6 processbuilder

8
推荐指数
2
解决办法
1万
查看次数

使用Unix命令在java中打印我的Mac序列号

我想在java程序中打印我的mac [编辑:Apple计算机]序列号.我熟悉Unix命令

ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
Run Code Online (Sandbox Code Playgroud)

这在终端完成了这项任务.
当我尝试

String command = "ioreg -l | awk '/IOPlatformSerialNumber/ { print $4; }'"
Runtime terminal = Runtime.getRuntime(); 
String input = new BufferedReader(
    new InputStreamReader(
        terminal.exec(commands).getInputStream())).readLine();
System.out.println(new BufferedReader(
    new InputStreamReader(
        terminal.exec(command, args).getInputStream())).readLine());
Run Code Online (Sandbox Code Playgroud)

我的序列号没有打印出来.相反它打印:

<+-o Root class IORegistryEntry, id 0x100000100, retain 10>  
Run Code Online (Sandbox Code Playgroud)

我认为问题在于terminal.exec()并不是要占用整个命令字符串.java中的某些东西是否类似于shell = Truepython中的参数,Popen(command, stdout=PIPE, shell=True)它允许我传递整个命令字符串?

java unix io macos

5
推荐指数
2
解决办法
5714
查看次数

通过Java将echo的输出重定向到文件

可能的重复:
ProcessBuilder 重定向输出

下面的代码:

ProcessBuilder pb = new ProcessBuilder(new String[] {"echo", "some text", ">", "test"});
Run Code Online (Sandbox Code Playgroud)

不断返回“ some text > test”。

我究竟做错了什么?

编辑:

这有效

ProcessBuilder pb = new ProcessBuilder(new String[] {"bash", "-c", "echo sometext > test"});
Run Code Online (Sandbox Code Playgroud)

java process io-redirection processbuilder

5
推荐指数
1
解决办法
5851
查看次数

从Java执行未加入的命令行

我目前正在使用ProcessBuilder从java服务器运行命令.此服务器将替换旧的Perl服务器,并且我们的许多遗留代码指定了特定于平台的命令行.

例如,在Windows上它可能会:

command -option "hello world"
Run Code Online (Sandbox Code Playgroud)

在unix上它可能会:

command -option 'hello world'
Run Code Online (Sandbox Code Playgroud)

问题是ProcessBuilder和Runtime.exec都为unix和windows接受了标记化的命令行(例如,{"command"," - option","hello world"}).

虽然我更喜欢平台独立的方式,但我们的代码库中有大约3000万行perl代码.如果没有我为不同的平台编写一个标记器(真的不是很重要,我只是不想制作WTF),有没有办法让操作系统上的shell标记命令行?

java command-line

1
推荐指数
2
解决办法
5481
查看次数