青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 200, comments - 8, trackbacks - 0, articles - 0

在java中使用Runtime.exec()時要注意的問題

Posted on 2014-04-08 15:20 鑫龍 閱讀(3481) 評論(0)  編輯 收藏 引用 所屬分類: Java

程序如下:

import java.util.*;

import java.io.*;

public class BadExecJavac

{

    public static void main(String args[])

    {

        try

        {           

            Runtime rt = Runtime.getRuntime();

            Process proc = rt.exec("javac");

            int exitVal = proc.exitValue();

            System.out.println("Process exitValue: " + exitVal);

        } catch (Throwable t)

          {

            t.printStackTrace();

          }

    }

}

運行結果如下

E:\classes\com\javaworld\jpitfalls\article2>java BadExecJavac
java.lang.IllegalThreadStateException: process has not exited       
at java.lang.Win32Process.exitValue(Native Method)       
at BadExecJavac.main(BadExecJavac.java:13)

這是因為當進程還沒有結束的情況下,調用exitValue方法會拋出IllegalThreadStateException.當然了我們會問為什嗎這個方法不會等到進程結束在返回一個合理的值?

在檢查Process類的所有可用方法以后我們發現WairFor()是一個更合適的方法。事實上waitFor也會返回exit value。這意味著你不可以同時用exitvalue和waitfor,而是只能選擇一個。

當然了也有情況你要在waitfor之前用exitvalue方法:就是你不想因為外部程序永遠無法完成而一直等待下去。

因此為了避免這個陷阱,我們要么捕獲IllegalThreadStateException異常,要么等待進程完成。我們相當然的以為可以用waitfor來等待程序的結束。代碼如下:

import java.util.*;
import java.io.*;
public class BadExecJavac2{   
   public static void main(String args[])    {       
      try        {                        
         Runtime rt = Runtime.getRuntime();           
         Process proc = rt.exec("javac");           
         int exitVal = proc.waitFor();           
         System.out.println("Process exitValue: " + exitVal);       
      } catch (Throwable t)          {           
         t.printStackTrace();         
      }   
   }
}

這次在linux下面返回的結果是2,而在windows下面據說程序會掛起,關于其原因我們可以在jdk文檔中找到部分解釋:因為一些操作系統為標準的輸入輸出僅僅提供有限的緩沖區,當不能正確的將信息寫進輸入流或者從輸出流中獲取信息時,就會導致子進程的阻塞,甚至死鎖。現在我們就根據jdk文檔來處理javac進程的輸出,當你不帶任何參數運行javac時,它會打印出一系列的有用的提示信息。而這些會被傳送到stderr流中。我們可以寫程序在其返回前獲取這些信息。下面的代碼提供了一個平庸的解決方案。

import java.util.*;import java.io.*;
public class MediocreExecJavac{   
   public static void main(String args[])    {       
       try        {                        
         Runtime rt = Runtime.getRuntime();           
         Process proc = rt.exec("javac");           
         InputStream stderr = proc.getErrorStream();           
         InputStreamReader isr = new InputStreamReader(stderr);           
         BufferedReader br = new BufferedReader(isr);           
         String line = null;           
         System.out.println("<ERROR>");           
         while ( (line = br.readLine()) != null)               
            System.out.println(line);           
         System.out.println("</ERROR>");           
         int exitVal = proc.waitFor();           
         System.out.println("Process exitValue: " + exitVal);       
      } catch (Throwable t)          {           
          t.printStackTrace();         
      }   
   }
}

這次程序可以正確的輸出了提示信息,但是我們應該注意到其返回代碼是2,我們知道任何非0的返回代碼都表示程序不正常。所以我們需要進一步的查找原因。對于win32而言是file not found,很明顯javac期望我們提供編譯的文件。所以對于永遠掛起的問題,如果你運行的程序會有輸出或者要求輸出入時,你需要處理輸出和輸入。我在linux下面運行的結果是正確的。前面說了在win32下面2代表是文件沒有找到,而在這種情況下表明是dir.exe沒有找到,(因為根本就沒有這個文件,他們都被封裝到common.com (win95)或者cmd.exe中了。

下面我們列出一個正確的處理Process的輸入輸出流的方法。需要用一個線程類。

import java.util.*;
import java.io.*;
class StreamGobbler extends Thread{   
   InputStream is;   
   String type;        
   StreamGobbler(InputStream is, String type)    {       
       this.is = is;       
       this.type = type;   
   }        

   public void run()    {       
      try        {           
          InputStreamReader isr = new InputStreamReader(is);           
          BufferedReader br = new BufferedReader(isr);           
          String line=null;           
      while ( (line = br.readLine()) != null)               
      System.out.println(type + ">" + line);                
      } catch (IOException ioe)             {               
       ioe.printStackTrace();               
      }   
   }
}

用于專門的處理輸入輸出。

public class GoodWindowsExec{   
    public static void main(String args[])    {       
        if (args.length < 1)        {           
            System.out.println("USAGE: java GoodWindowsExec <cmd>");           
            System.exit(1);       
        }                
        try        {                        
            String osName = System.getProperty("os.name" );           
            String[] cmd = new String[3];           
            if( osName.equals( "Windows NT" ) )            {               
                cmd[0] = "cmd.exe" ;               
                cmd[1] = "/C" ;               
                cmd[2] = args[0];           
            }            else if( osName.equals( "Windows 95" ) )            {               
                cmd[0] = "command.com" ;               
                cmd[1] = "/C" ;               
                cmd[2] = args[0];            }                        
            Runtime rt = Runtime.getRuntime();            
            System.out.println("Execing " + cmd[0] + " " + cmd[1] + " " + cmd[2]);           
            Process proc = rt.exec(cmd);            // any error message?           
            StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(), "ERROR");  // any output?           
            StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(), "OUTPUT");                            // kick them off           
            errorGobbler.start();           
            outputGobbler.start();                                                // any error???           
            int exitVal = proc.waitFor();           
            System.out.println("ExitValue: " + exitVal);                
        } catch (Throwable t)          {           
            t.printStackTrace();          
        }   
    }
}

如果運行如下命令上面的代碼會調用word程序

>java GoodWindowExec “abc.doc”

也就是說文件類型如果window能夠識別它就會調用對應的程序處理。

StreamGlobbler的最重要作用是他會清空所有的傳遞給他的inputstream,這樣不會造成Process阻塞或者死鎖。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精彩免费视频| 国产精品久久久久久妇女6080| 久久久999国产| 亚洲欧美韩国| 翔田千里一区二区| 久久精品国产精品亚洲| 久久精品电影| 欧美电影在线观看完整版| 欧美黄污视频| 亚洲乱亚洲高清| 亚洲午夜av电影| 欧美成人综合网站| 欧美一级欧美一级在线播放| 欧美一区二区三区在线看| 国产亚洲精品bt天堂精选| 国内精品久久久久影院薰衣草 | 欧美69视频| 欧美黄色视屏| 国产精品爽黄69| 在线综合亚洲欧美在线视频| 一区二区三区精品久久久| 亚洲欧美中文日韩v在线观看| 久久精品亚洲乱码伦伦中文| 欧美激情亚洲| 亚洲在线电影| 欧美/亚洲一区| 国产女人18毛片水18精品| 亚洲国产色一区| 午夜精品久久久久久| 欧美成人激情视频| 亚洲一本视频| 六月婷婷久久| 国产情侣一区| 一本色道久久| 欧美xart系列高清| 久久久久国产成人精品亚洲午夜| 亚洲国产你懂的| 中国成人在线视频| 麻豆久久婷婷| 欲色影视综合吧| 欧美一区日韩一区| 激情国产一区| 国产精品社区| 亚洲欧美清纯在线制服| 亚洲韩国青草视频| 久久中文欧美| 尤物yw午夜国产精品视频| 欧美一区观看| 亚洲欧美国产毛片在线| 国产精品电影网站| 亚洲午夜在线观看| 欧美网站大全在线观看| 亚洲黄色大片| 欧美肥婆bbw| 久久只精品国产| 亚洲激情午夜| 欧美高清视频在线播放| 免费成人激情视频| 久久国产视频网站| 激情综合激情| 久久亚洲色图| 麻豆精品一区二区av白丝在线| 激情丁香综合| 狠狠色狠狠色综合人人| 国产伦精品一区二区三区高清版| 亚洲男女毛片无遮挡| 亚洲午夜精品福利| 国产日韩欧美三级| 久久婷婷国产综合精品青草| 久久成人免费| 亚洲成人在线视频播放| 欧美风情在线观看| 欧美国产亚洲精品久久久8v| 99精品国产99久久久久久福利| 亚洲毛片av| 国产精品久久国产三级国电话系列| 亚洲一区欧美| 欧美影院一区| 亚洲人精品午夜| 在线视频你懂得一区| 国产乱肥老妇国产一区二| 久久亚洲综合色一区二区三区| 久久免费午夜影院| 亚洲精选中文字幕| 欧美一级视频| 久久久99爱| 99精品视频一区二区三区| 亚洲午夜视频在线观看| 国产一区二区丝袜高跟鞋图片| 欧美不卡福利| 欧美午夜视频网站| 欧美精品久久一区| 国产日韩欧美一二三区| 欧美激情性爽国产精品17p| 欧美日韩精品一本二本三本| 久久国产精品久久久久久电车| 久久亚洲精品视频| 亚洲欧美怡红院| 欧美va亚洲va国产综合| 日韩视频在线观看国产| 亚洲自拍高清| 99精品欧美一区二区三区综合在线| 亚洲欧美成人一区二区三区| 亚洲人体偷拍| 久久国产精品久久久久久久久久| 亚洲最新在线| 久久一区二区三区四区五区| 午夜精品三级视频福利| 欧美精品日本| 欧美大片免费观看| 国产一区二区黄色| 午夜久久资源| 欧美日韩国产小视频在线观看| 欧美一区1区三区3区公司| 欧美成人中文字幕在线| 久久久久久久久久久久久久一区| 欧美二区在线| 免费短视频成人日韩| 国产精品日韩精品| 亚洲电影下载| 午夜精品久久久| 欧美日韩系列| 亚洲欧洲日韩综合二区| 在线观看成人av电影| 午夜精品一区二区三区在线视| 99re6这里只有精品视频在线观看| 欧美在线看片| 久久精品国产清自在天天线| 国产精品国产福利国产秒拍| 亚洲精品免费一二三区| 亚洲三级电影全部在线观看高清| 久久久人成影片一区二区三区| 久久国产一区| 国产一区二区黄| 久久国产精品一区二区三区| 久久精品一区二区国产| 国产日韩精品一区观看 | 亚洲精品国产精品久久清纯直播| 久久婷婷成人综合色| 国产一区美女| 久久国产一区二区三区| 久久综合影音| 亚洲国产国产亚洲一二三| 久久这里有精品15一区二区三区 | 久久成人在线| 国产精品久久国产愉拍| 亚洲午夜久久久久久久久电影网| 亚洲永久视频| 国产精品自拍视频| 久久精品99| 欧美丰满高潮xxxx喷水动漫| 亚洲美女av在线播放| 欧美日韩hd| 亚洲一区二区在线看| 欧美专区在线观看| 永久91嫩草亚洲精品人人| 欧美福利视频网站| 一区二区三区日韩欧美精品| 欧美一级一区| 亚洲国产精品久久久久秋霞蜜臀| 欧美国产日本高清在线| 亚洲午夜精品17c| 欧美成人首页| 亚洲欧美激情一区| 久久久欧美精品| 一本色道久久88亚洲综合88| 欧美一区二区视频在线观看2020 | 一区二区三区av| 国产精品热久久久久夜色精品三区| 亚洲一区在线观看视频| 国产亚洲制服色| 老司机aⅴ在线精品导航| 国产精品qvod| 久久先锋影音av| 99精品欧美一区二区三区| 久久久久国内| 99精品视频一区| 国产一区在线播放| 欧美日韩美女| 久久久午夜精品| 亚洲视频在线观看| 亚洲第一中文字幕在线观看| 午夜伦理片一区| 亚洲精品国精品久久99热一| 国产伦精品一区二区三区高清| 免费观看一区| 午夜精品久久久久久99热软件| 亚洲大黄网站| 久久久久一区二区三区| 国产精品美女www爽爽爽视频 | 亚洲欧洲美洲综合色网| 91久久国产综合久久| 久久久另类综合| 亚洲午夜免费视频| 亚洲日本电影在线| 一区在线观看视频| 亚洲一区二区三区四区五区午夜| 国产欧美日韩另类一区| 欧美午夜精品理论片a级按摩| 你懂的国产精品|