国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解

java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解

2022-03-10 00:40Morpheus丶 Java教程

這篇文章主要介紹了java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

在java.lang.Runtime.exec的使用中,我們經常會用到將重定向命令執行的輸入/結果或者將錯誤信息讀取出來.

那么,在使用過程中,我們如何正確的使用呢?

 

什么是java.lang.Runtime

首先我們要明確一點,什么是Java.lang.Runtime? 我們來看官方[->link<-]的描述:

" Every Java application has a single instance of class Runtime that allows the application to interface with the environment in which the application is running. The current runtime can be obtained from the getRuntime method.

An application cannot create its own instance of this class. "

也就是說,Runtime是每個java-application運行時有且僅有一個的當前實例.允許Application接入當前運行環境.

我們再來看看Runtime的exec()方法:

" Executes the specified command in a separate process. "

這個方法可以讓我們在一個進程中執行指定的命令.其返回類型是Process類.

那么我們還需要來看一下Process類:

 

什么是java.lang.Process

什么是Java.lang.Process? 我們來看官方[->link<-]的描述:

"The class Process provides methods for performing input from the process, performing output to the process, waiting for the process to complete, checking the exit status of the process, and destroying (killing) the process."

也就是說這個類提供控制線程的方法.

我們再來看看Process提供的獲取輸入流和輸出流的方法:

public abstract InputStream getInputStream()

"Returns the input stream connected to the normal output of the subprocess.
The stream obtains data piped from the standard output of the process represented by this Process object."
public abstract OutputStream getOutputStream()
"Returns the output stream connected to the normal input of the subprocess.
Output to the stream is piped into the standard input of the process represented by this Process object."

public abstract InputStream getErrorStream()

"Returns the input stream connected to the error output of the subprocess.
The stream obtains data piped from the error output of the process represented by this Process object."

到這里,我們就明白里其中的因果>從exec()返回的Process的對象中調用獲取流的方法.從而達到目的!

 

具體做法

在需要使用exec()去執行命令并獲取返回值的時候,具體的做法是什么呢?

僅僅圍繞這個思路:"從exec()返回的Process的對象中調用獲取流的方法getXStream"

String s = null;
            Process p = Runtime
                    .getRuntime()
                    .exec(
                            new String[]{"/bin/sh",
                                        "-c",
                                        "java HelloWorld"},null,dir);

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));

            //打印出輸出結果
            log.info("標準輸出命令");
            while ((s = stdInput.readLine()) != null) {
                  log.info(s);
            }

            log.info("標準錯誤的輸出命令");
            while ((s = stdError.readLine()) != null) {
                  log.info(s);
            }

其中

dir 是我的HelloWorld.class的存放目錄,只能這樣用,請參照這篇

HelloWorld.java 的內容是Sysotem.out.println打印幾行Hello World,此處沒有編譯,使用時應注意.

java.lang.Runtime.exec的左膀右臂:流輸入和流讀取詳解

到此,大功告成!

 

Runtime.exec 陷阱

該類java.lang.Runtime具有一個稱為的靜態方法getRuntime(),該方法檢索當前的Java Runtime Environment。這是獲得對該Runtime對象的引用的唯一方法。使用該參考,您可以通過調用Runtime類的exec()方法來運行外部程序。開發人員經常調用此方法來啟動瀏覽器,以顯示HTML的幫助頁面。

該exec()命令有四個重載版本:

public Process exec(String command);
public Process exec(String [] cmdArray);
public Process exec(String command, String [] envp);
public Process exec(String [] cmdArray, String [] envp);

對于這些方法中的每一個,命令(可能還有一組參數)都傳遞給特定于操作系統的函數調用。隨后,這將參考Process返回給Java VM的類來創建特定于操作系統的進程(正在運行的程序)。所述Process類是一個抽象類,因為一個特定的子類Process存在于每個操作系統。

您可以將三個可能的輸入參數傳遞給這些方法:

  • 一個字符串,代表要執行的程序和該程序的所有參數
  • 字符串數組,用于將程序與其參數分開
  • 一組環境變量

以形式傳遞環境變量name=value。如果exec()對程序及其參數使用單個字符串的版本,請注意,通過StringTokenizer類使用空格作為分隔符來解析該字符串。

IllegalThreadStateException

要執行Java VM外部的進程,我們使用exec()方法。要查看外部進程返回的值,我們exitValue()。

如果外部過程尚未完成,則該exitValue()方法將拋出IllegalThreadStateException;。這就是該程序失敗的原因。盡管文檔中說明了這一事實,但為什么不能等到此方法可以給出有效答案呢?

對該Process類中可用的方法進行更徹底的研究,就會發現waitFor()可以做到這一點的方法。實際上,waitFor()還會返回退出值,這意味著您將不會使用exitValue()和waitFor()彼此結合,而是會選擇一個或另一個。你會使用的唯一可能的時間exitValue(),而不是waitFor()會當你不希望你的程序阻止等待外部過程中可能永遠不會完成。與其使用該waitFor()方法,不如將一個被調用的布爾參數waitFor傳入該exitValue()方法以確定當前線程是否應等待。布爾值會更有利,因為exitValue()是此方法的更合適的名稱,兩個方法在不同條件下不必執行相同的功能。這種簡單的條件判別是輸入參數的領域。

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();
        }
  }
}
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();
        }
  }
}

因此,為避免此陷阱,請捕獲IllegalThreadStateException或等待該過程完成。

為什么Runtime.exec()掛起

由于某些本機平臺僅為標準輸入和輸出流提供有限的緩沖區大小,因此未能及時寫入子流程的輸入流或讀取子流程的輸出流可能導致子流程阻塞,甚至死鎖。

現在,讓我們關注JDK文檔并處理javac過程的輸出。當您javac不帶任何參數運行時,它會生成一組用法語句,這些用法語句描述了如何運行程序以及所有可用程序選項的含義。知道這將stderr流到流,您可以輕松地編寫一個程序以在等待進程退出之前耗盡該流。清單4.3完成了該任務。盡管此方法行之有效,但這不是一個好的通用解決方案。因此,清單4.3的程序被命名為MediocreExecJavac;。它僅提供平庸的解決方案。更好的解決方案將同時清空標準錯誤流和標準輸出流。最好的解決方案是同時清空這些流(稍后再說明)

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();
        }
  }
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/timo1160139211/article/details/75050886

延伸 · 閱讀

精彩推薦
  • Java教程shiro之記住登錄信息

    shiro之記住登錄信息

    Shiro提供了記住我(RememberMe)的功能,當關閉瀏覽器時下次再次打開還能記住你的信息,下面小編給大家分享shiro之記住登錄信息的相關知識,感興趣的朋...

    動力節點6182021-01-07
  • Java教程java數組排列組合問題匯總

    java數組排列組合問題匯總

    這篇文章主要為大家詳細匯總了java數組排列組合問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xh1511162021-03-31
  • Java教程Spring Boot 五種熱部署方式,極速開發就是生產力!

    Spring Boot 五種熱部署方式,極速開發就是生產力!

    在 Spring Boot 中,模板引擎的頁面默認是開啟緩存的,如果修改了頁面的內容,則刷新頁面是得不到修改后的頁面的,因此我們可以在application.properties中關...

    民工哥技術之路6712021-12-31
  • Java教程Spring Cloud引入Eureka組件,完善服務治理

    Spring Cloud引入Eureka組件,完善服務治理

    這篇文章主要介紹了Spring Cloud引入Eureka組件,完善服務治理的過程詳解,幫助大家更好的理解和使用spring cloud,感興趣的朋友可以了解下...

    精靈王11282021-08-04
  • Java教程Java使用Math.random()結合蒙特卡洛方法計算pi值示例

    Java使用Math.random()結合蒙特卡洛方法計算pi值示例

    這篇文章主要介紹了Java使用Math.random()結合蒙特卡洛方法計算pi值的方法,簡單說明了結合具體實例蒙特卡洛方法的原理,并結合具體實例形式分析了java使用蒙...

    軟貨11032021-01-04
  • Java教程Java設計模式之java迭代器模式詳解

    Java設計模式之java迭代器模式詳解

    這篇文章主要介紹了java迭代器模式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一...

    大忽悠愛忽悠8122022-01-04
  • Java教程SpringMVC文件上傳的配置實例詳解

    SpringMVC文件上傳的配置實例詳解

    本文通過實例代碼給大家介紹SpringMVC文件上傳的配置相關內容,本文介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起學習吧 ...

    逆火狂飆2592020-04-28
  • Java教程Java算法實現楊輝三角的講解

    Java算法實現楊輝三角的講解

    今天小編就為大家分享一篇關于Java算法實現楊輝三角的講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來...

    kuls4202021-07-02
主站蜘蛛池模板: 精品美女 | 成人片网址 | 91精品久久久久久久久久入口 | 最近中文字幕 | 男人天堂网站 | 精品久久久久久久久久久久久久久久久久 | 亚洲激情综合 | 91午夜伦伦电影理论片 | 色屁屁影院 | 欧美成人免费在线 | 亚洲精品wwww | 亚洲www啪成人一区二区 | 在线一区二区三区做爰视频网站 | www成人精品| 精品欧美一区二区三区久久久 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲xxxx3d | 在线视频 中文字幕 | 蜜桃视频网站在线观看 | 日韩一区二区福利 | 亚洲97 | 精品无码久久久久国产 | 国产成人av在线 | av一级久久 | 99国产精品99久久久久久 | 一色屋精品久久久久久久久久 | 九九综合九九 | 啪啪av| 伊人网在线视频观看 | 国产精品一区二区无线 | 欧美,日韩,国产精品免费观看 | 午夜国产| 婷婷综合激情 | 久久久久久国产精品免费免费狐狸 | 亚洲亚色 | 免费日本视频 | 玖玖玖影院 | 91视视频在线观看入口直接观看 | 婷婷综合在线 | 色在线免费 | 亚洲国产中文字幕 |