我想寻求关于如何创建一个函数的想法,该函数由于我的 Java 应用程序通过标准输出的延迟而始终等待新行?
我想以一种逐步呈现数据而不是作为一个整体呈现数据的方式将其显示到我的终端控制台。
这是我的java代码:
public class HelloWorld {
public static void main(String[] args) {
// Prints "Hello, World" to the terminal window.
// System.out.println("Hello, Worldzzz");
for (int i=1; i<11; i++) {
try {
Thread.sleep(500);
}
catch (Exception e) {
}
System.out.println("Count is: " + i);
}
}
}
到目前为止,这是我的 Node js 代码:
var http = require('http'),
util = require('util'),
url = require('url'),
exec = require('child_process').exec,
child,
result = '',
poort = 8088;
http.createServer(function(req, res) {
res.writeHead(200, {
'Content-Type': 'text/plain'
});
var pathname = url.parse(req.url).pathname;
if (pathname == '/test') {
res.write('test:');
child = exec('java HelloWorld', function(error, stdout, stderr) {
console.log = function(d) {
process.stdout.write(d + stdout + '\n');
};
//console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
})
res.end();
} else {
res.write('operation not allowed');
res.end();
}
}).listen(poort);
最佳答案
您需要使用 child_process.spawn()
并监听事件,而不是使用 child_process.exec()
。
例子
这是一个等待 Java 程序完成并在一大块中打印所有内容的简化示例:
var exec = require('child_process').exec;
var child = exec('java HelloWorld', function (error, stdout, stderr) {
if (error) {
console.error('Error:', error);
} else {
process.stdout.write(stdout);
}
});
这是一个 Node 程序在 Java 程序打印后立即处理每一行的示例:
var spawn = require('child_process').spawn;
var child = spawn('java', ['HelloWorld']);
child.on('error', function (err) {
console.error('Error:', err);
});
child.stdout.on('data', function (data) {
process.stdout.write(data.toString());
});
请记住 data
是一个缓冲区而不是字符串 - 如果您需要一个字符串,您必须使用 data.toString()
(这里它也可以在没有.toString()
因为 process.stdout.write()
可以将缓冲区作为参数,但为了清楚起见我添加了它)。
您可能还需要监听关闭事件,以便知道它何时完成写入输出:
var spawn = require('child_process').spawn;
var child = spawn('java', ['HelloWorld']);
child.on('error', function (err) {
console.error('Error:', err);
});
child.stdout.on('data', function (data) {
process.stdout.write(data.toString());
});
child.on('close', function (code) {
console.log('Child exited with code', code);
});
参见 the documentation of spawn了解更多详情。
关于javascript - 如何创建一个始终等待来自 java system.out.println 的新行的 Node js 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40524918/