我想验证的东西,因为在我的脑子很有道理,但在Java中,这是行不通的。
我想通过我的应用程序运行另一个Jar文件。 甲的Minecraft服务器,要精确。 我把所有的基础知识之后(使用ProcessBuilder
,带参数运行,等待退出代码等),但有一两件事,我想不通。 发送命令给应用程序。 我在这里一部分CommandLineSender
类:
public class CommandLineSender extends Thread {
private BufferedWriter output;
private InputStream source; // Set to System.in when creating the object
private boolean stopRequested;
public CommandLineSender(Process sendTo, InputStream source) {
this.output = new BufferedWriter(new OutputStreamWriter(sendTo.getOutputStream()));
this.source = source;
System.out.println("Source InputStream initiated: " + source.toString());
this.stopRequested = false;
}
@Override
public void run() {
System.out.println("Run called.");
Scanner cmdScanner = new Scanner(source);
while (cmdScanner.hasNextLine() && !stopRequested) {
System.out.println("Has next line");
String msg = cmdScanner.nextLine();
write(msg);
System.out.println("Wrote: " + msg);
}
// Close the scanner and BufferedWriter
System.out.println("Closed.");
}
// Other various methods
protected void write(String msg) {
try {
output.write(msg);
} catch (IOException e) {
System.err.println("Unable to write message because of an unhandled IOException: " + e.getMessage());
}
}
我得到的输出是这样的:
(Default Minecraft server output)
help // My command
Has next line
Wrote: help
这可能并不重要,但我执行我的服务器使用这些参数:
java -Xmx1024M -Xms1024M -jar (path to server jar) nogui
感谢您的时间。
下面是通过其进程操纵一个C程序的Java程序的例子(你可以操纵一个Java程序太)。 几年前我写了这个。 有一个在C或Java的接收器程序,并在Java中的发件人。 看一看:
C接收机
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
int main() {
char message[50] = {0};
while ( true ) {
gets( message );
printf( "string \"%s\" received...\n", message );
// forces the streams to flush
fflush( stdout );
fflush( stderr ); // the java program will not write in the error stream, so this line (for this example) is irrelevant
// if the java program send a "end" command (message here) it will break the while
if ( !strcmp( "end", message ) ) {
break;
}
}
return 0;
}
爪哇接收机(等于C程序)
import java.util.*;
public class MessageReceiver {
public static void main( String[] args ) {
Scanner scan = new Scanner( System.in );
while ( true ) {
String message = scan.nextLine();
System.out.printf( "string \"%s\" received...\n", message );
System.out.flush();
System.err.flush();
if ( message.equals( "end" ) ) {
break;
}
}
}
}
Java的转播
import java.io.*;
import java.util.*;
public class Sender {
/**
* @param args the command line arguments
*/
public static void main( String[] args ) {
new Sender().execute();
}
public void execute() {
try {
// executes the command (the C executable)
Process process = Runtime.getRuntime().exec( "MessageReceiver.exe" );
// or, executes the MessageReceiver class
//Process process = Runtime.getRuntime().exec( "java MessageReceiver" );
// create the stream gobblers, one for the input stream and one for the
// error stream. these gobblers will consume these streams.
StreamGobbler sgInput = new StreamGobbler(
process.getInputStream(), "input" );
StreamGobbler sgError = new StreamGobbler(
process.getErrorStream(), "error" );
// creates a thread for each stream gobbler and start them
new Thread( sgInput ).start();
new Thread( sgError ).start();
// creates a PrintWriter using the process output stream
PrintWriter writer = new PrintWriter( process.getOutputStream() );
// preparing to read user input
Scanner scan = new Scanner( System.in );
while ( true ) {
System.out.println( "Send a command: " );
String command = scan.nextLine();
// sends the command to the process
// simulating an user input (note the \n)
writer.write( command );
writer.write( "\n" );
writer.flush();
// if the command is end, finalizes this app too
if ( command.equals( "end" ) ) {
break;
}
}
} catch ( IOException ioe ) {
ioe.printStackTrace();
}
}
/**
* Threads to consume the process streams.
* Based in the implementation presented here:
* http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1
*
* @author David Buzatto
*/
private class StreamGobbler implements Runnable {
private InputStream is;
private String type;
private FileWriter fw;
public StreamGobbler( InputStream is, String type ) {
this.is = is;
this.type = type;
}
public StreamGobbler( InputStream is, String type, File file )
throws IOException {
this.is = is;
this.type = type;
this.fw = new FileWriter( file );
}
@Override
public void run() {
try {
InputStreamReader isr = new InputStreamReader( is );
BufferedReader br = new BufferedReader( isr );
String line = null;
while ( ( line = br.readLine() ) != null ) {
if ( fw != null ) {
fw.write( line + "\n" );
} else {
System.out.println( type + ">" + line );
}
}
if ( fw != null ) {
fw.close();
}
} catch ( IOException ioe ) {
ioe.printStackTrace();
}
}
}
}
要运行代码,编译C程序或MessageReceiver类。 把可执行文件在你的发件人类的同一个文件夹,编译并运行。 “结束”命令将完成接收器和发送器。
就拿这篇文章一看太: http://www.javaworld.com/jw-12-2000/jw-1229-traps.html