Java.lang.ProcessBuilderクラスの学習


最近の仕事で、ProcessBuilderというクラスを知りました.以前使ったことがなくて、ほほほ、知识は浅薄です...ネット上で多くの資料を見つけて、今記録します.皆さんに少しでも助けてほしいです.
前言:Javaのクラスライブラリはますます膨大になり、含まれているクラスとインタフェースも数え切れないほどあります.しかし、Javaクラスライブラリの核心部分である非常に重要なクラスとインタフェースがあります.よく見られるのはString、Object、Class、Collection、ClassLoader、Runtime、Process、ProcessBuilder…で、これらのクラスを熟知することがJavaをマスターする基礎です.これらの類は一般的に理解しにくく、深い研究と実践をしなければ掌握できない.以下は私がこれらのクラスを理解し、使用したいくつかの総括です.あなたが読んだ後にあなたの貴重な意見と読後感を残すことを歓迎します!
一、概説      ProcessBuilderクラスはJ 2 SE 1.5がjava.langに新しく追加した新しいクラスで、オペレーティングシステムプロセスを作成するために使用され、プロセス(つまりアプリケーション)を起動および管理する方法を提供します.J 2 SE 1.5まではプロセスの制御管理はプロセスクラスで行われていた.      プロセスビルダーインスタンスごとにプロセス属性セットを管理します.そのstart()メソッドは、これらのプロパティを使用して新しいProcessインスタンスを作成します.start()メソッドは、同じインスタンスから繰り返し呼び出して、同じまたは関連する属性を使用して新しいサブプロセスを作成できます.
 
各プロセス・ビルダー(ProcessBuilderオブジェクト)は、これらのプロセス・プロパティを管理します.
コマンドは、呼び出す外部プログラムファイルとそのパラメータ(ある場合)を表す文字列リストです.ここで、有効なオペレーティングシステムコマンドを示す文字列リストは、システムに依存します.たとえば、各全体的な変数は、通常、このリストの要素になりますが、プログラムがコマンドライン文字列を自分でマークすることを望むオペレーティングシステムもあります.このシステムでは、Java実装では、コマンドがこの2つの要素を正確に含む必要がある場合があります.環境は変数から値へのシステム依存マッピングです.初期値は、現在のプロセス環境のコピーです(System.getenv()を参照).作業ディレクトリ.デフォルトは、現在のプロセスの現在の作業ディレクトリであり、通常はシステム属性user.dirに基づいて名前が付けられます.redirectErrorStreamプロパティ.当初、このプロパティはfalseであり、サブプロセスの標準出力とエラー出力が2つの独立したストリームに送信されることを意味し、これらのストリームはProcess.getInputStream()とProcess.getErrorStream()メソッドでアクセスすることができる.値をtrueに設定すると、標準エラーが標準出力にマージされます.これにより、エラーメッセージと対応する出力を関連付けることが容易になります.この場合、マージされたデータはProcess.getInputStream()から返されるストリームから読み込まれ、Process.getErrorStream()から返されるストリームの読み取りはファイルの末尾に直接到達します.
      プロセスクラスがある以上、なぜプロセスビルダークラスを発明するのでしょうか.ProcessBuilderとProcessの2つのクラスにはどのような違いがありますか?従来、ProcessBuilderはプロセスにより多くの制御を提供していました.たとえば、現在の作業ディレクトリを設定したり、環境パラメータを変更したりすることができます.プロセスの機能は比較的簡単です.      ProcessBuilderはfinalクラスで、パラメータ付きの2つの構築方法があり、構築方法で直接ProcessBuilderのオブジェクトを作成できます.一方、Processは抽象クラスであり、一般的にRuntime.exec()とProcessBuilder.start()によって間接的にインスタンスを作成します.
注意:      プロセスビルダーのプロパティを変更すると、オブジェクトのstart()メソッドによって開始される後続のプロセスに影響しますが、以前に開始されたプロセスやJava自体のプロセスには影響しません.      ProcessBuilderクラスは同期ではありません.複数のスレッドが同時に1つのProcessBuilderにアクセスし、少なくとも1つのスレッドが構造的に1つの属性を変更した場合は、外部同期を維持する必要があります.デフォルトの作業ディレクトリと環境を使用する新しいプロセスを簡単に開始できます.
  • Process  p =  new  Process Builder ( "myCommand",  "myArg").start();  
  • Process p = new ProcessBuilder
    ("myCommand", "myArg").start();
    次は、変更された作業ディレクトリおよび環境起動プロセスを使用する例です.
  • Process Builder  pb =  new  Process Builder ( "myCommand",  "myArg1",  "myArg2");  
  • Map env = pb.environment();  
  • env.put("VAR1",  "myValue");  
  • env.remove("OTHERVAR");  
  • env.put("VAR2", env.get( "VAR1") +  "suffix");  
  • pb.directory(new  File( "myDir"));  
  • Process  p = pb.start();  
  •      ProcessBuilder
     pb = new ProcessBuilder
    ("myCommand", "myArg1", "myArg2");
         Map<String, String> env = pb.environment();
         env.put("VAR1", "myValue");
         env.remove("OTHERVAR");
         env.put("VAR2", env.get("VAR1") + "suffix");
         pb.directory(new File("myDir"));
         Process p = pb.start();

    参照:http://lavasoft.blog.51cto.com/62575/15662
    1,Process Builderを使用した例
  • package  net.java2000.util;  
  •   
  • import  java.io.BufferedReader;  
  • import  java.io.File;  
  • import  java.io.InputStream;  
  • import  java.io.InputStreamReader;  
  • import  java.util.Arrays;  
  •  
  •  public   class  TestProcess Builder  {  
  •   public   static   void  main(String args[])  throws  Exception {  
  •   
  •     Process Builder  builder = new  Process Builder ( "cmd",  "/c",  "dir");  
  •     builder.directory (new  File( "e:/"));  
  •     Process  process  = builder.start();  
  •     InputStream is = process .getInputStream();  
  •     InputStreamReader isr = new  InputStreamReader(is,  "GBK");  
  •     BufferedReader br = new  BufferedReader(isr);  
  •     String line;  
  •   
  •     System.out.printf("Output of running %s is:", Arrays.toString(args));  
  •   
  •     while  ((line = br.readLine()) !=  null ) {  
  •       System.out.println(line);  
  •     }  
  •   }  

  • このコード実行のプロセスはcmdで実行することに相当する:cmd/e dir
    Eディスクディレクトリの下にあるファイルとフォルダが一覧表示されます.
    2、もう一つの例があります.
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.Properties;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    
    public class Test {
    
    public static String getMACAddress() {
    
    String address = "";
    String os = System.getProperty("os.name");
    System.out.println(os);
    if (os != null) {
    if (os.startsWith("Windows")) {
    try {
    ProcessBuilder pb = new ProcessBuilder("ipconfig", "/all");
    Process p = pb.start();
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    while ((line = br.readLine()) != null) {
    if (line.indexOf("Physical Address") != -1) {
    int index = line.indexOf(":");
    address = line.substring(index + 1);
    break;
    }
    }
    br.close();
    return address.trim();
    } catch (IOException e) {
    
    }
    }else if(os.startsWith("Linux")){
    try {
    ProcessBuilder pb = new ProcessBuilder(
    
    "ifconfig","/all"
    );
    
    
    Process p = pb.start();
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    while((line=br.readLine())!=null){
    int index=line.indexOf("    ");
    if(index!=-1){
    address=line.substring(index+4);
    break;
    }
    }
    br.close();
    return address.trim();
    } catch (IOException ex) {
    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    }
    }
    return address;
    }
    
    public static void main(String[] args) {
    System.out.println("" + Test.getMACAddress());
    }
    }
    この例では、xp下およびlinux下の自機のmacアドレスを取得し、ipconfig/allコマンドを実行することができる.
    まとめ:
    プロセスビルダーは、現在の作業ディレクトリを設定したり、環境パラメータを変更したりするなど、プロセスにより多くの制御を提供します.
    プロセスの機能は比較的簡単です.
    Process Builderはfinalクラスで、パラメータ付きの2つの構築方法があり、構築方法で直接作成できます.
    プロセスビルダーのオブジェクト.
    Processは抽象クラスで、一般的にRuntime.exec()と
    Process Builder.start()は、インスタンスを間接的に作成します.