今天使用nio编写一个类似ssh的网络客户端,在执行process的时候,出现了一个让人很头疼的bug,废话不说,上代码:
public static void main(String[] args)throws Exception {
Process process=Runtime.getRuntime().exec("cmd /c tree");
int status=process.exitValue();
System.out.println(status);
BufferedReader reader=new BufferedReader(new InputStreamReader(process.getInputStream()));
String line=null;
while((line=reader.readLine())!=null) {
System.out.println(line);
}
BufferedReader error=new BufferedReader(new InputStreamReader(process.getErrorStream()));
while((line=error.readLine())!=null) {
System.out.println(line);
}
}
在process后面立即调用后
int status=process.exitValue();
,出现了
java.lang.IllegalThreadStateException: process has not exited
at java.lang.Win32Process.exitValue(Native Method)
异常,后台一百度发现,jdk实现process时,调用外部命令不是同步的调用,而是异步执行。所以tree命令还没有执行成功就返回,jdk抛出异常。
后来想了一招,就是不管执行如何,先去读取process的InputStream和ErrorInputStream,也就是说
不管外部命令执行的正确与否,都先去执行一次。
//读取正确执行的返回流
BufferedReader info=new BufferedReader(new InputStreamReader(executor.getInputStream()));
while((line=info.readLine())!=null) {
infoMsg.append(line).append("\n");
}
//读取错误执行的返回流
BufferedReader error=new BufferedReader(new InputStreamReader(executor.getErrorStream()));
while((line=error.readLine())!=null) {
errorMsg.append(line).append("\n");
}
//调用exitValue返回值
responseCode=executor.exitValue();
这个时候,再调用exitValue()方法就不会出错了
这是一个具体的实例
int responseCode=0;
StringBuilder infoMsg=new StringBuilder();
StringBuilder errorMsg=new StringBuilder();
String line=null;
String cmd=Util.isWindows()?("cmd /c "+command):(command);
System.err.println("command is "+cmd);
Process executor=Runtime.getRuntime().exec(cmd);
BufferedReader info=new BufferedReader(new InputStreamReader(executor.getInputStream()));
BufferedReader error=new BufferedReader(new InputStreamReader(executor.getErrorStream()));
while((line=info.readLine())!=null) {
infoMsg.append(line).append("\n");
}
while((line=error.readLine())!=null) {
errorMsg.append(line).append("\n");
}
responseCode=executor.exitValue();
分享到:
相关推荐
- 为了确保程序在不同版本的Windows上运行,可能需要根据操作系统平台选择使用`cmd.exe`还是`command.com`。 3. **打开关联应用程序的文件** - 要打开一个关联了特定应用程序的文件,可以直接调用文件路径,例如...
Java Process Manager是一个基于Java语言开发的工具,它利用JNI(Java Native Interface)技术与Windows 32 SDK(Software Development Kit)进行交互,旨在提供类似操作系统任务管理器的功能,特别是针对Java进程的...
在Java编程语言中,`Process`类是处理操作系统进程的核心组件。它允许Java应用程序与操作系统交互,执行外部命令,例如运行系统工具或者控制其他应用程序。本文将深入探讨`JAVA Process`的使用,以及如何通过Java...
功能:获取java进程pid 进程可根据该pid调用exec自杀 注意事项:不能改变PidTool.java所在的包,否则需要重行生成dll。 编译命令中 "-PidTool.dll" 改为 "-FePidTool.dll",我整漏了! 使用方法: 1.javac PidTool...
在Java中,我们可以使用Java Native Interface(JNI)来调用Windows API,获得系统的内存信息和CPU使用率。我们可以使用GetSystemInfo函数来获得系统的内存信息,包括物理内存的大小、可用内存的大小和页面文件的...
Java 和 PowerShell 是两种在 Windows 操作系统中常用于管理和控制系统的工具。Java 是一种跨平台的编程语言,而 PowerShell 是微软开发的一种命令行脚本环境,尤其适合管理系统资源。在这个场景下,我们可以利用 ...
"Image-Process.rar_Java process-Thread_image process java_java im"这个标题暗示了我们将探讨如何在Java中处理图像,特别是涉及线程管理和多线程图像处理。 首先,让我们了解Java中的图像处理基础。Java提供了`...
在开发这个任务管理器时,Java的跨平台性使得程序可以在不同操作系统上运行,只需一个JVM(Java虚拟机)支持。此外,Java提供了丰富的类库和API,使得开发者能够方便地实现进程管理、UI设计等功能。 在实现过程中,...
在Java编程环境中,管理和控制Windows进程是一项常见的任务,特别是在系统集成、自动化运维或者软件开发中。本篇文章将探讨如何利用Java来实现这一功能,并结合标签“源码”和“工具”,我们将深入理解如何通过源...
本教程将详细介绍如何在Windows上搭建这样的环境,并使用Java调用FFmpeg进行视频处理。 首先,我们需要在Windows系统上安装FFmpeg。可以从FFmpeg官方网站下载最新版本的二进制文件,解压后将其路径添加到系统的PATH...
在Java编程语言中,对象创建的过程是一个至关重要的概念,它涉及到类的实例化和内存管理。下面我们将深入探讨这个主题。 首先,让我们了解一个Java对象的生命周期,它通常包括以下几个步骤: 1. **定义类(Class ...
实现内存动态分区,运用Java语言,一共四个类,这是process类
在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如调用Windows的命令行工具(CMD)。这通常涉及到使用Java的Runtime类或者ProcessBuilder类来创建和管理进程。本文将深入探讨如何在Java...
**ProcessMonitor:Windows系统监控利器** ProcessMonitor,简称ProcMon,是由Sysinternals(现为Microsoft Corporation的一部分)开发的一款强大的实时文件系统、注册表和进程活动监控工具。它结合了两个早期的...
进程控制块的设计与实现 进程的创建,执行,阻塞,唤醒。 还有进程调度,采用了短作业优先和先来先服务算法
### JAVA如何调用WINDOWS命令行 ...总之,通过合理地使用Java的`Runtime`和`Process`类,我们可以轻松地实现在Java应用程序中调用Windows命令行的功能。这对于需要执行复杂系统任务的Java程序来说非常有用。
在"java-image-process"这个项目中,很可能包含了一些自定义的图像处理类或方法,用于封装上述操作,提供更友好的API给开发者使用。可能还会有专门的类负责读取命令行参数或GUI控件的事件,以实现用户指定的图像处理...
MBR负责识别硬盘上的分区表,并判断哪个分区是活动分区。 - **Boot Sector**:活动分区的第一个扇区称为Boot Sector,其中包含了重要的引导代码,用于加载操作系统的其他组件。 #### 三、BIOS与Boot Specification ...
下面我们将详细探讨如何利用`app_process`来实现这一目标,以及在Java中如何进行相关操作。 首先,`app_process`是Android系统中的一个可执行文件,它位于系统的`/system/bin`目录下,用于启动一个应用程序的主进程...
本文将详细介绍如何使用Java来调用Windows平台上的各种应用程序。 #### 二、基础知识 在深入探讨具体的代码实现之前,我们先来了解一下几个重要的概念和技术背景: 1. **Runtime 类**:`java.lang.Runtime` 是一...