2017-04-05 40 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); 
      } 
     } 

    } 
} 

參見: