0

これは、hello.exe の C++ コードです。

#include<iostream.h>
#include<conio.h>
int  main()
{
  cout<<"Hello world\n";
  getch();
  cout<<"I bypass error\n";
  return 0;
}

Java プログラムから hello.exe を実行する必要があります。

サブプロセスのbinファイルを呼び出し、IOによる制御実行をそれらのbinファイルに送るためにJavaを学びたいです。

この hello.exe のように、hello world が出力され、値を入力できる場合は、"I bypass error" を確認できるのは私だけです。

これは私のJavaプログラムです:

package procs;

import java.io.*;
import java.lang.*;
import java.util.*;

public class Procs
{
   public static void main(String[] args)
   {

      Scanner scan = new Scanner(System.in);

      try
      {
         int exitVal;
         char c = 'a';
         Process process = Runtime.getRuntime().exec(new String[]{"C:/hello.exe"});
         OutputStream stdin = process.getOutputStream();
         InputStream stderr = process.getErrorStream();
         InputStream stdout = process.getInputStream();

         BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
         //PrintStream writer = new PrintStream(new BufferedOutputStream(stdin));
         //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
         // i uses both printstream and Buffered writer

         System.out.println("lets start<<<<<<");
         do
         {
            c = (char)reader.read();
            System.out.print(c);
         }
         while (c != '\n');
         //writer.Print(c);  i uses  both print
         //writer.write(c);  and the writer
         writer.flush();
         do
         {
            c = (char)reader.read();
            System.out.print(c);
         }
         while (c != '\n');
         exitVal = process.waitFor();
         System.out.println("Exited with error code " + exitVal);
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
   }
}

の後にハングしますlets start<<<<<

Hello Worldすら表示されません

また、この部分で私を助けてください:

exitVal=process.waitFor();

このように、プロセスの実行を一時停止する一時停止コマンドがあります

4

2 に答える 2

1
writer.write(c);
writer.flush();

上記のステートメントstdinはサブプロセスに書き込みますが、入力を取得していないため、getch()読み取っていないようです。代わりに orstdinを使用する必要があります。on を置き換えるとフラッシュが廃止されるため、 on には奇妙な効果があるようです。cin >> c;c = getc(stdin)getch()stdoutcout

ここにいくつかの作業コードがあります:

// C++

#include<iostream>

using namespace std;

int  main()
{
    cout<<"Hello world\n";
    char c;
    cin >> c;
    cout<<"input received "  << c << endl;
    cout<<"I bypass error\n";
    return 0;
}

// Java

BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

System.out.println("lets start<<<<<<");
do {
 c = (char) reader.read();
   System.out.print(c);
} while (c != '\n' && c != -1 && c != Character.MAX_VALUE);
System.out.print('\n');
System.out.print("(1) stdout of subprocess consumed.");

c = (char) System.in.read();
writer.write(c);
writer.flush();


do {
 c = (char) reader.read();
   System.out.print(c);
} while (c != '\n' && c != -1 && c != Character.MAX_VALUE);
System.out.print('\n');
System.out.print("(2) stdout of subprocess consumed.");

exitVal = process.waitFor();
System.out.println("Exited with error code " + exitVal);

この文

exitVal=process.waitFor();

現在のスレッド(あなたの場合はメインスレッド)がサブプロセスが終了するのを待たなければならず、それが返す値をキャッチすることを意味します(Process#waitFor()のjavadocを参照してください)。この値はreturn 0;、C++ プログラムで返される値です。

出力

lets start<<<<<<
Hello world

(1) stdout of subprocess consumed.a
input received a

(2) stdout of subprocess consumed.Exited with error code 0

a直後(1) ... consumed.はコンソールの入力であり、出力の一部ではないことに注意してください。

于 2013-05-25T10:45:25.097 に答える