Tips48
Tips48

Reputation: 745

Process.getOutputStream() doesn't work?

So I'm starting a Bukkit (Minecraft) server from a GUI.

ProcessBuilder builder = new ProcessBuilder();
builder.redirectErrorStream(true);
builder.command("java", "-jar", file.getAbsolutePath());

try {
    p = builder.start();
    input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    output = new DataOutputStream(p.getOutputStream());
} catch (IOException e) {
    Logger.logError(e);
    return;
}

There are no errors, and the server itself starts correctly. The input stream works correctly too, as I get all the input as I should. Now, I have this method to send a command to the server.

public void send(String message) {
    try {
        output.writeUTF(message + "\n");
        output.flush();
    } catch (IOException e) {
        Logger.logError(e);
    }
}

For some reason though, it doesn't work. I'm not sure if I missed a step, or am looking over something, etc. Any help would be greatly appreciated!

Upvotes: 0

Views: 2857

Answers (1)

initramfs
initramfs

Reputation: 8405

I suspect the DataOutputStream is writing data in a non-conventional way towards the OutputStream, try using a PrintWriter object instead.

Consider this:

try {
    p = builder.start();
    input = new BufferedReader(new InputStreamReader(p.getInputStream()));
    output = new PrintWriter(p.getOutputStream());
} catch (IOException e) {
    Logger.logError(e);
    return;
}


The Send method:

public void send(String message) {
    output.println(message);
    output.flush();
}

P.S You no longer need the try-catch around the output.println() as PrintWriter's print and println methods don't throw IOException.

From bukkit's plugin perspective (read my comment if you have no clue what this is):

final JavaPlugin Inst = ... //This plugin's object

try(BufferedReader Reader = new BufferedReader(new InputStreamReader(System.in, Charset.forName("UTF-8")))){
    while((Line = Reader.readLine()) != null){
        final String L = Line;
        Bukkit.getScheduler().runTask(Inst, new Runnable(){
            @Override
            public void run() {
                 Bukkit.dispatchCommand(Bukkit.getConsoleSender(), L);
            }
        });
    }
}catch(IOException ex){
    //Handle this
}

Upvotes: 1

Related Questions