2017-04-05 238 views
0

当我尝试运行子进程并将其放入stdin某些文本时,它会引发错误。 这里是子进程的代码:Node.js child.stdin.write不起作用

import java.io.Console; 

public class HelloWorld { 
    public static void main(String[] args) { 
     System.out.println("started"); 

     Console console = System.console(); 

     while (true) { 
      String s = console.readLine(); 
      System.out.println("Your sentence:" + s); 
     } 
    } 
} 

脚本的代码,运行此程序:

var spawn = require('child_process').spawn; 

var child = spawn('java', ['HelloWorld', 'HelloWorld.class']); 


child.stdin.setEncoding('utf-8'); 

child.stdout.pipe(process.stdout); 


child.stdin.write("tratata\n"); 

// child.stdin.end(); 

它抛出:

events.js:161 
    throw er; // Unhandled 'error' event 
^

Error: read ECONNRESET 
    at exports._errnoException (util.js:1028:11) 
    at Pipe.onread (net.js:572:26) 

通知,当我child.stdin取消注释行。结束();它只是结束任何内部消除反应

+0

FWIW'child.stdin.setEncoding('utf-8');'不正确。 'setEncoding()'用于'Readable'流,但'child.stdin'用作'Writable'流。 – mscdex

+0

此外,你是否尝试使用CRLF而不是LF作为行结尾(例如'child.stdin.write(“tratata \ r \ n”);')? – mscdex

回答

0

的一件事,你需要使脚本的工作是添加:

process.stdin.pipe(child.stdin); 

如果您在child.stdin.write之前添加这,这将解决问题的一半。另一半与Java方面有关。如果未通过键入java HelloWorld从控制台启动java程序,则Console将返回空值,因此如果您尝试使用Console.readLine,则会得到NullPointerException。要解决此问题,请使用BufferedReader

脚本改成这样:

const spawn = require('child_process').spawn; 
const child = spawn('java', ['HelloWorld'], { 
    stdio: ['pipe', process.stdout, process.stderr] 
}); 

process.stdin.pipe(child.stdin); 
setTimeout(() => { 
    child.stdin.write('tratata\n'); 
}, 1000); 

然后改变你的Java代码到这一点:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 

import java.io.IOException; 

public class HelloWorld { 
    public static void main(String[] args) throws IOException { 
     System.out.println("started"); 

     try(BufferedReader console = new BufferedReader(new InputStreamReader(System.in))) { 
      for (String line = console.readLine(); line != null; line = console.readLine()) { 
       System.out.printf("Your sentence: %s\n", line); 
      } 
     } 

    } 
} 

参见: