【问题标题】:My ProcessBuilder code does not work. Run craftbukkit from this program我的 ProcessBuilder 代码不起作用。从这个程序运行craftbukkit
【发布时间】: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


【解决方案1】:

我有几个建议:

(1) 在创建进程之前调用processBuilder.redirectErrorStream(true);,将进程的标准错误重定向到其标准输出。该进程可能正在将消息写入其标准错误,但如果您只读取标准输出,您可能看不到它们。

(2) 当 BufferedReader 的 readLine() 返回 null 时,底层流已到达文件尾。没有必要再尝试阅读了,因为您只会进一步了解nulls。一旦对readLine() 的调用返回null,您应该将break 退出outputHandler 中的while 循环。

我不能保证这些建议会为您彻底解决问题,但它们至少应该可以帮助您找出程序无法运行的原因。

【讨论】:

  • 我添加了:processBuilder.redirectErrorStream(true);processBuilder.redirectOutput();processBuilder.redirectInput(); 现在我从服务器获取线路。非常感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2012-03-07
  • 2011-10-15
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多