javascript - 如何创建一个始终等待来自 java system.out.println 的新行的 Node js 函数?

标签 javascript java node.js

我想寻求关于如何创建一个函数的想法,该函数由于我的 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/

相关文章:

regex - 如何在 Mongoose 中搜索和替换?

javascript - 如何让 Selenium 点击ID以外的对象

java - 如何添加日期,然后将其与 Hibernate 中的当前日期进行比较?

javascript - 如何在另一个面板打开时关闭 Accordion 面板?

java - 无法解决依赖关系...直到更新间隔已过或强制更新

java - Swift iOS 不确定应用程序或远程服务器是否应该处理 amazon s3

node.js - 使用 Mongoose 查找文档,其中父级和子级都匹配查询

node.js - NodeJs : dotenv not working for nested paths

javascript - 从回调函数内部将项目添加到全局数组,然后全局访问它

javascript - 相关下拉列表 state 、 city 和 pincode