【发布时间】:2014-08-12 14:06:06
【问题描述】:
我尝试创建一个程序来运行craftbukkit.jar 并处理输入/输出流,但它不起作用。
这是我的代码,我做错了什么?
package info.nordbyen.bukkitwrapper;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class BukkitWrapper
{
private final static String PATH_TO_JAVA_PROGRAM = "C:\\Program Files\\Java\\jre7\\bin";
private final static String NAME_OF_JAVA_PROGRAM = "java.exe";
private final static String PATH_TO_CRAFTBUKKIT_FILE = "C:\\l0lkj\\bukkit\\1.7.10_wrapper_tester";
private final static String NAME_OF_CRAFTBUKKIT_FILE = "craftbukkit-1.7.10-R0.1-20140808.005431-8";
private static Process process = null;
private static BufferedReader in = null;
private static OutputStream os = null;
private static Scanner scanner;
public static void main( String[] args )
{
scanner = new Scanner( System.in );
System.out.println( "Starter..." );
ProcessBuilder processBuilder = new ProcessBuilder( PATH_TO_JAVA_PROGRAM + "\\" + NAME_OF_JAVA_PROGRAM, "-jar", PATH_TO_CRAFTBUKKIT_FILE + "\\" + NAME_OF_CRAFTBUKKIT_FILE ); //,"--nojline"
try
{
process = processBuilder.start();
}
catch ( IOException e )
{
System.out.println( "ERROR!" );
System.out.println( e );
System.exit( -1 );
}
if( process == null )
{
System.out.println( "ERROR!" );
System.out.println( "process is null" );
System.exit( -1 );
}
InputStream is = process.getInputStream();
os = process.getOutputStream();
if( is == null )
{
System.out.println( "ERROR!" );
System.out.println( "is is null" );
System.exit( -1 );
}
if( os == null )
{
System.out.println( "ERROR!" );
System.out.println( "os is null" );
System.exit( -1 );
}
in = new BufferedReader( new InputStreamReader( is ) );
inputHandler();
outputHandler();
}
private static void inputHandler()
{
Thread thread = new Thread()
{
public void run()
{
while( true )
{
String line = scanner.nextLine();
try
{
os.write( line.getBytes() );
}
catch ( IOException e )
{
System.out.println( "ERROR!" );
System.out.println( e );
System.exit( -1 );
}
}
}
};
thread.start();
}
private static void outputHandler()
{
while( true )
{
String line = null;
try
{
line = in.readLine();
}
catch ( IOException e )
{
System.out.println( "ERROR!" );
System.out.println( e );
}
System.out.println( currentTime() + line );
}
}
private static String currentTime()
{
SimpleDateFormat sdf = new SimpleDateFormat( "[yyyy-mm-dd hh:mm:ss] -> " );
Date now = new Date();
String date = sdf.format( now );
return date;
}
}
我没有收到任何错误,但输入一直返回 null。这是控制台:
[2014-04-12 04:04:06] -> null
[2014-04-12 04:04:06] -> null
[2014-04-12 04:04:06] -> null
[2014-04-12 04:04:06] -> null
[2014-04-12 04:04:06] -> null
Etc. Etc.
感谢您的帮助:)
编辑: 对于有同样问题的人,只需添加
processBuilder.redirectErrorStream(true);
processBuilder.redirectOutput();
processBuilder.redirectInput();
在创建流程之前,正如卢克伍德沃德在回答中所说的那样。
对于null 问题,我只是添加了一个简单的if 语句:
if( line.length() >= 1 )
{
System.out.println( Div.currentTime() + line );
}
我仍然无法将文本写入进程。谁知道如何解决这个问题?
编辑 2: 现在一切正常:)
【问题讨论】:
-
您提到的“将文本写入进程的问题”是什么?
-
我试图在控制台中写一些文本,但服务器(进程)没有反应。我把它改成了打印机,所以现在可以了。我忘了更新问题
-
好的,很高兴听到您解决了问题。
标签: java stream processbuilder