`
kingj
  • 浏览: 425644 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java Process在windows上的陷阱

 
阅读更多

今天使用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();
分享到:
评论

相关推荐

    java调用windows命令

    - 为了确保程序在不同版本的Windows上运行,可能需要根据操作系统平台选择使用`cmd.exe`还是`command.com`。 3. **打开关联应用程序的文件** - 要打开一个关联了特定应用程序的文件,可以直接调用文件路径,例如...

    Java Process Manager

    Java Process Manager是一个基于Java语言开发的工具,它利用JNI(Java Native Interface)技术与Windows 32 SDK(Software Development Kit)进行交互,旨在提供类似操作系统任务管理器的功能,特别是针对Java进程的...

    JAVA Process 使用

    在Java编程语言中,`Process`类是处理操作系统进程的核心组件。它允许Java应用程序与操作系统交互,执行外部命令,例如运行系统工具或者控制其他应用程序。本文将深入探讨`JAVA Process`的使用,以及如何通过Java...

    java获取当前windows进程pid

    功能:获取java进程pid 进程可根据该pid调用exec自杀 注意事项:不能改变PidTool.java所在的包,否则需要重行生成dll。 编译命令中 "-PidTool.dll" 改为 "-FePidTool.dll",我整漏了! 使用方法: 1.javac PidTool...

    java管理windows系统内存_java释放内存缓存_java获得CPU使用率_系统内存_硬盘_进程源代码

    在Java中,我们可以使用Java Native Interface(JNI)来调用Windows API,获得系统的内存信息和CPU使用率。我们可以使用GetSystemInfo函数来获得系统的内存信息,包括物理内存的大小、可用内存的大小和页面文件的...

    java+powershell 控制windows

    Java 和 PowerShell 是两种在 Windows 操作系统中常用于管理和控制系统的工具。Java 是一种跨平台的编程语言,而 PowerShell 是微软开发的一种命令行脚本环境,尤其适合管理系统资源。在这个场景下,我们可以利用 ...

    Image-Process.rar_Java process-Thread_image process java_java im

    "Image-Process.rar_Java process-Thread_image process java_java im"这个标题暗示了我们将探讨如何在Java中处理图像,特别是涉及线程管理和多线程图像处理。 首先,让我们了解Java中的图像处理基础。Java提供了`...

    Java编写的windows任务管理器

    在开发这个任务管理器时,Java的跨平台性使得程序可以在不同操作系统上运行,只需一个JVM(Java虚拟机)支持。此外,Java提供了丰富的类库和API,使得开发者能够方便地实现进程管理、UI设计等功能。 在实现过程中,...

    java管理windows进程

    在Java编程环境中,管理和控制Windows进程是一项常见的任务,特别是在系统集成、自动化运维或者软件开发中。本篇文章将探讨如何利用Java来实现这一功能,并结合标签“源码”和“工具”,我们将深入理解如何通过源...

    windows下java调用ffmpeg视频处理环境搭建

    本教程将详细介绍如何在Windows上搭建这样的环境,并使用Java调用FFmpeg进行视频处理。 首先,我们需要在Windows系统上安装FFmpeg。可以从FFmpeg官方网站下载最新版本的二进制文件,解压后将其路径添加到系统的PATH...

    java object create process

    在Java编程语言中,对象创建的过程是一个至关重要的概念,它涉及到类的实例化和内存管理。下面我们将深入探讨这个主题。 首先,让我们了解一个Java对象的生命周期,它通常包括以下几个步骤: 1. **定义类(Class ...

    内存动态分区Java - process类

    实现内存动态分区,运用Java语言,一共四个类,这是process类

    java 调用 windows cmd 命令

    在Java编程中,有时我们需要与操作系统进行交互,执行一些系统级别的任务,比如调用Windows的命令行工具(CMD)。这通常涉及到使用Java的Runtime类或者ProcessBuilder类来创建和管理进程。本文将深入探讨如何在Java...

    ProcessMonitor windows 跟踪工具

    **ProcessMonitor:Windows系统监控利器** ProcessMonitor,简称ProcMon,是由Sysinternals(现为Microsoft Corporation的一部分)开发的一款强大的实时文件系统、注册表和进程活动监控工具。它结合了两个早期的...

    process.JAVA

    进程控制块的设计与实现 进程的创建,执行,阻塞,唤醒。 还有进程调度,采用了短作业优先和先来先服务算法

    JAVA如何调用WINDOWS命令行.doc

    ### JAVA如何调用WINDOWS命令行 ...总之,通过合理地使用Java的`Runtime`和`Process`类,我们可以轻松地实现在Java应用程序中调用Windows命令行的功能。这对于需要执行复杂系统任务的Java程序来说非常有用。

    java-image-process.rar_java_java image process

    在"java-image-process"这个项目中,很可能包含了一些自定义的图像处理类或方法,用于封装上述操作,提供更友好的API给开发者使用。可能还会有专门的类负责读取命令行参数或GUI控件的事件,以实现用户指定的图像处理...

    Windows boot process

    MBR负责识别硬盘上的分区表,并判断哪个分区是活动分区。 - **Boot Sector**:活动分区的第一个扇区称为Boot Sector,其中包含了重要的引导代码,用于加载操作系统的其他组件。 #### 三、BIOS与Boot Specification ...

    利用app_process实现免root调用shell_Java_下载.zip

    下面我们将详细探讨如何利用`app_process`来实现这一目标,以及在Java中如何进行相关操作。 首先,`app_process`是Android系统中的一个可执行文件,它位于系统的`/system/bin`目录下,用于启动一个应用程序的主进程...

    java调用Windows应用程序

    本文将详细介绍如何使用Java来调用Windows平台上的各种应用程序。 #### 二、基础知识 在深入探讨具体的代码实现之前,我们先来了解一下几个重要的概念和技术背景: 1. **Runtime 类**:`java.lang.Runtime` 是一...

Global site tag (gtag.js) - Google Analytics