У меня есть исполняемый файл C ++, который открывает файл и записывает в него строку. Работает нормально само по себе.
#include <iostream>
#include <fstream>
using namespace std;
int main(){
ofstream fout;
fout.open("test.txt");
if(fout.is_open()){
cout<<"test"<<endl;
fout<<"Hello World!" << endl;
}
fout.close();
return 0;
}
И я сделал main () в Java, чтобы вызвать его оттуда так:
public static void main(String args[]){
File f = new Resources().getFile("test.exe");
System.out.println(f.exists());
String path = f.getAbsolutePath();try{
Process p = new ProcessBuilder(path).start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while(line != null){
line = br.readLine();
System.out.println(line);
}
p.destroy();
}catch(Exception e){
System.out.println(e.getMessage());
}
}
Первая строка в main из моего проекта, он находит файл, он тоже работает.
Дело в том, что когда исполняемый файл запускается один, он создает файл и записывает в него. Когда я запускаю java main (), файл не создается, хотя я получаю вывод из stdout. Таким образом, исполняемый файл запускается, но не создает файл.
Я схожу с ума, люди … что делать?
использование Process.waitFor()
метод вместо Process.destroy()
метод.
Это было бы самым простым, что вы можете использовать, но имейте в виду, что это будет работать в вашем конкретном простом случае. Если ваш exe печатает сначала в stderr, он заблокируется. В другом случае вам нужно 2 потока, которые будут читать stdout и stderr вашего процесса, чтобы не блокировать.
try
{
Process proc = Runtime.getRuntime().exec( "your exec here" );
// handle process' stdout stream
InputStream out = proc.getInputStream();
//Thread err = proc.getErrorStream();
BufferedReader br = new BufferedReader( new InputStreamReader( out ) );int exitVal = proc.waitFor();
String line;
while ( ( line = br.readLine() ) != null )
{
System.out.println( line );
}
}
catch( Exception e )
{
System.out.println( "oops: " + e.getMessage() );
}