Мне нужно написать скрипт на Perl, который направляет ввод в программу Java. Это связано с этим , но это мне не помогло. Моя проблема в том, что приложение Java не получает операторы печати, пока я не закрою дескриптор. В Интернете я обнаружил, что $ | необходимо установить значение больше 0, в этом случае символы новой строки будут очищать буфер. Это все еще не работает.
Это скрипт:
#! /usr/bin/perl -w
use strict;
use File::Basename;
$|=1;
open(TP, "| java -jar test.jar") or die "fail";
sleep(2);
print TP "this is test 1\n";
print TP "this is test 2\n";
print "tests printed, waiting 5s\n";
sleep(5);
print "wait over. closing handle...\n";
close TP;
print "closed.\n";
print "sleeping for 5s...\n";
sleep(5);
print "script finished!\n";
exit
А вот пример приложения Java:
import java.util.Scanner;
public class test{
public static void main( String[] args ){
Scanner sc = new Scanner( System.in );
int crashcount = 0;
while( true ){
try{
String input = sc.nextLine();
System.out.println( ":: INPUT: " + input );
if( "bananas".equals(input) ){
break;
}
} catch( Exception e ){
System.out.println( ":: EXCEPTION: " + e.toString() );
crashcount++;
if( crashcount == 5 ){
System.out.println( ":: Looks like stdin is broke" );
break;
}
}
}
System.out.println( ":: IT'S OVER!" );
return;
}
}
Приложение Java должно реагировать на получение тестовых отпечатков немедленно, но не до оператора close в скрипте Perl. Что я делаю не так?
Примечание: исправление может быть только в скрипте Perl. Приложение Java не может быть изменено. Также есть File :: Basename, потому что я использую его в реальном скрипте.