Process getOutputStreamに大きな出力を書き込むにはどうすればいいですか?

java

コマンドを実行しようとしています(例: ps -ef | ProcessBuilderとProcessを使って このコードは、 ‘ps -ef’の出力が小さい限り機能します。 しかし、出力が大きすぎると、プログラムはハングします。 これを修正する方法はありますか? これが[http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html%5D]に基づく私のコードです。

#### Program.java #### import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter;

import java.util.ArrayList; java.util.Collectionsをインポートします。 import java.util.List; import java.util.Map;

パブリッククラスプログラム

プライベートリストコマンド。

public Program(String commandString)はIOException {this(commandString、null);をスローします。 }

public List getCommand(){return this.command; }

private void setCommand(String filename、String location、String commandString、List parameters)はIOExceptionをスローします{if(filename!= null){commandString = new File(location、filename).getCanonicalPath) }

this.command = Collections.synchronizedList(new ArrayList());

this.command.add(commandString); if(parameters!= null){for(String arg:parameters){command.add(arg); }}}

public String [] run()はIOException、InterruptedExceptionをスローします{return this.run(null); }

public String [] run(String input)はIOException、InterruptedExceptionをスローします。

リストcommandList = processBuilder.command();

プロセスprocess = processBuilder.start(); if(input!= null){PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(process.getOutputStream()))、true); writer.println(入力) writer.flush(); writer.close(); process.getOutputStream()。close();} Gobbler outGobbler = new Gobbler(process.getInputStream()); Gobbler errGobbler = new Gobbler(process.getErrorStream());

Thread outThread = new Thread(outGobbler);スレッドerrThread = new Thread(errGobbler);

outThread.start(); errThread.start();

outThread.join(); errThread.join();

int exitVal = process.waitFor(); System.out.println( "処理待ち:" exitVal);

リスト出力= outGobbler.getOuput();

output.toArray(new String [output.size()])を返します。 }}


#### CommandExecutor.java ####

import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List;

パブリッククラスCommandExecutor {

公開リスト>プログラム。

public static void main(String [] args){

{CommandExecutor ce = new CommandExecutor(args [0]);を試してください。ストリング出力= ce.run(); System.out.println( "Command:" args [0]); System.out.println( "Output:" output); } catch(IOException e){// TODO自動生成されたcatchブロックSystem.out.println(e.getLocalizedMessage()); e.printStackTrace(); } catch(InterruptedException ie){// TODO自動生成されたcatchブロックSystem.out.println(ie.getLocalizedMessage()); ie.printStackTrace(); }

}

public CommandExecutor(String command)はIOException {this.setPrograms(command);}をスローします。 }

private void setPrograms(String command)はIOExceptionをスローします。{this.programs = new ArrayList>();

// String cmdstring = ""; String [] commands = command.split( "\\ s *; \\ s *"); for(String c:commands){//文字列subcmdstr = "";文字列ファイル= null。 String [] chainedCommands = c.split( "\\ s * \\ | \\ s *"); String lastCmd = chainedCommands [chainedCommands.length-1]; String [] fileCmd = lastCmd.split( "\\ s *> \\ s *"); if(fileCmd.length> 1){chainedCommands [chainedCommands.length-1] = fileCmd [0]; file = fileCmd [1];リストl = new ArrayList(); for(String p:chainedCommands){/ * if(subcmdstr.equals( "")){subcmdstr = p;} } else {subcmdstr = "pにリダイレクトします。 String [] cmdparams = p.split( "");文字列cmd = cmdparams [0]; List params = new ArrayList(); (int j = 1; j <cmdparams.length; j){params.add(cmdparams [j]);プログラムprog = new Program(cmd、params); add(prog); if(file!= null){// subcmdstr = "file:にリダイレクトします。 l.add(ファイル); this.programs.add(l); // cmdstring = "新しいコマンド:" subcmdstr "\ n"; //System.out.println("Actual Command: "command); //System.out.println("Command String:\ n "cmdstring); }

public String run()がIOException、InterruptedExceptionをスローします。{String output = "";

for(リストl:this.programs){String [] out = new String [0]; int count = 0; boolean filenotfound = true; for(Object o:l){if(o instanceof Program){Program p =(Program)o; if(count == 0){out = p.run(); } else {out = p.run(CommandExecutor.arrayToString(out));}そうでなければ(o instanceof String){PrintWriter f = new PrintWriter(new File((String)o)); f.print(CommandExecutor.arrayToString(out)); f.close(); filenotfound = false; }                 カウント  ; if(filenotfound){output = CommandExecutor.arrayToString(out);} }}

出力を返します。 }

public static String arrayToString(String [] strArray){String str = ""; for(String s:strArray){str = s; strを返す。 }}

ありがとう、

四分位数

  3  1


ベストアンサー

さて、私はそれがうまくいった。 以下は、コマンドのリストを与えられたコードです、それは1つのコマンドの出力を次のものにパイプします。

/ * ####### PipeRedirection.java * /

import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List;

パブリッククラスPipeRedirection {

public static void main(String [] args)FileNotFoundExceptionをスローします。

if(args.length <2){System.err.println( "少なくとも2つの引数が必要です"); System.exit(1); }

{String input = null;}を試してください。 for(int i = 0; i <args.length; i){

String [] commandList = args [i] .split( "");

ProcessBuilder pb = new ProcessBuilder(commandList); //pb.redirectErrorStream(true);プロセスp = pb.start();

if(input!= null){PrintWriter writer = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(p.getOutputStream()))、true); writer.println(入力) writer.flush(); writer.close(); }

InputProcess.Gobbler outGobbler = new InputProcess.Gobbler(p.getInputStream()); InputProcess.Gobbler errGobbler = new InputProcess.Gobbler(p.getErrorStream()); Thread outThread = new Thread(outGobbler);スレッドerrThread = new Thread(errGobbler); outThread.start(); errThread.start();

outThread.join(); errThread.join();

int exitVal = p.waitFor(); System.out.println( "\ n ****************************"); System.out.println( "Command:" args [i]); System.out.println( "Exit Value =" exitVal);リスト出力= outGobbler.getOuput(); input = ""; for(String o:output){input = o; System.out.println( "最終出力:"); System.out.println(入力);

} catch(IOException ioe){// TODO自動生成されたcatchブロックSystem.err.println(ioe.getLocalizedMessage()); ioe.printStackTrace(); } catch(InterruptedException ie){// TODO自動生成されたcatchブロックSystem.err.println(ie.getLocalizedMessage()); ie.printStackTrace(); }

}

Gobblerは、Runnable {private BufferedReader reader; public static class Gobblerを実装しています。プライベートリストの出力

public Gobbler(InputStream inputStream){this.reader = new BufferedReader(new InputStreamReader(inputStream)); }

public void run(){文字列行; this.output = new ArrayList(); {while((line = this.reader.readLine())!= null){this.output.add(line "\ n"); this.reader.close(); } catch(IOException e){// TODO System.err.println( "エラー:" e.getMessage());} }}

public List getOuput(){return this.output;} }}}

5


文字列として出力しないで、CommandExecuterにオプションのOutputStream(あなたの場合はSystem.outを引数として渡します)を渡して、それをそのストリームに書き込みます。

現在のプログラムでは、Main Methodがプログラムを実行し、runメソッドが何かを返すまで何も印刷しません(ハング)。

3


タイトルとURLをコピーしました