【问题标题】:How to create a node js function that always wait for new lines from java system.out.println?如何创建一个始终等待来自 java system.out.println 的新行的节点 js 函数?
【发布时间】:2016-11-10 10:11:30
【问题描述】:

我想了解如何创建一个由于我的 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);
        }
    }
}

到目前为止,这是我的节点 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);    

【问题讨论】:

  • .exec 在调用回调之前不是已经等待程序终止了吗?

标签: javascript java node.js


【解决方案1】:

您需要使用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

【讨论】:

  • @user66 很高兴知道。我很高兴能帮上忙。您可以accept the answer,以便其他搜索该问题的人知道该问题已得到解答。
猜你喜欢
  • 2021-07-19
  • 2020-11-06
  • 2019-02-16
  • 2020-06-26
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
相关资源
最近更新 更多