如何使用 ProcessBuilder 获取 wvdial 的输出?
How to get output of wvdial with ProcessBuilder?
下面的代码打印执行过程的输出(使用不同的线程输出):
public static void main(String[] args) throws InterruptedException,
IOException {
ProcessBuilder builder = new ProcessBuilder("some_command");
final Process process = builder.start();
final Thread ioThread = new Thread() {
@Override
public void run() {
try {
final BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
};
ioThread.start();
process.waitFor();
}
所以,如果我 运行 这个代码
ProcessBuilder builder = new ProcessBuilder("ping","8.8.8.8");
输出将是这样的:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=205 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=202 ms
...
但是如果我 运行
ProcessBuilder builder = new ProcessBuilder("wvdial");
然后命令将被执行(wvdial 将启动)但是 BufferedReader
中将没有输出。 wvdial
在终端中显示输出文本。
为什么 wvdial
没有给出 ProcessBuilder
的输出?
也许它会写入 stderr
? process.getErrorStream()
大多数 UNIX 程序避免将供人类使用的信息消息写入 stdout
。特别是批处理程序。 stdout
用于程序结果,用于数据输出,不用于信息性消息。
您也许还能理解退出代码,从而消除对输出解析的需要。
下面的代码打印执行过程的输出(使用不同的线程输出):
public static void main(String[] args) throws InterruptedException,
IOException {
ProcessBuilder builder = new ProcessBuilder("some_command");
final Process process = builder.start();
final Thread ioThread = new Thread() {
@Override
public void run() {
try {
final BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
} catch (final Exception e) {
e.printStackTrace();
}
}
};
ioThread.start();
process.waitFor();
}
所以,如果我 运行 这个代码
ProcessBuilder builder = new ProcessBuilder("ping","8.8.8.8");
输出将是这样的:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=57 time=205 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=57 time=202 ms
...
但是如果我 运行
ProcessBuilder builder = new ProcessBuilder("wvdial");
然后命令将被执行(wvdial 将启动)但是 BufferedReader
中将没有输出。 wvdial
在终端中显示输出文本。
为什么 wvdial
没有给出 ProcessBuilder
的输出?
也许它会写入 stderr
? process.getErrorStream()
大多数 UNIX 程序避免将供人类使用的信息消息写入 stdout
。特别是批处理程序。 stdout
用于程序结果,用于数据输出,不用于信息性消息。
您也许还能理解退出代码,从而消除对输出解析的需要。