Nodejs调用Java程序做一些文件处理,怎样通信?JNI?

Nodejs调用Java程序做一些文件处理,怎样通信?JNI?

希望经验者能分享一下,node调用java程序处理文件怎么掉比较好。 同事告诉我JNI,查了半天没搞明白,node通过JNI跟java通信是怎么样的? 不是简单地起一个进程执行java指令吧?

7 回复

Node.js 调用 Java 程序进行文件处理:JNI 实现

JNI(Java Native Interface)是一种允许 Java 代码和其他语言编写的代码进行交互的技术。然而,直接使用 JNI 来实现 Node.js 和 Java 的通信并不是最直接的方法。通常,更常见的做法是通过进程间通信(IPC)机制来实现这一目标。例如,可以通过 child_process 模块在 Node.js 中启动一个 Java 进程,并通过标准输入输出(stdin/stdout)进行通信。

使用 child_process 模块

首先,确保你有一个 Java 程序用于文件处理。这里是一个简单的 Java 示例:

// FileProcessor.java
public class FileProcessor {
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Usage: java FileProcessor <inputFile> <outputFile>");
            return;
        }
        
        String inputFile = args[0];
        String outputFile = args[1];

        // 读取文件并处理(这里简化为复制文件)
        try {
            java.nio.file.Files.copy(java.nio.file.Paths.get(inputFile), java.nio.file.Paths.get(outputFile));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

接下来,在 Node.js 中调用该 Java 程序:

const { execFile } = require('child_process');

function processFile(inputFile, outputFile) {
    const javaProgram = 'java';
    const className = 'FileProcessor';
    
    // 构建命令行参数
    const args = [className, inputFile, outputFile];
    
    // 执行 Java 程序
    execFile(javaProgram, args, (error, stdout, stderr) => {
        if (error) {
            console.error(`执行失败: ${stderr}`);
            return;
        }
        console.log(`文件处理完成: ${stdout}`);
    });
}

// 示例调用
processFile('/path/to/input.txt', '/path/to/output.txt');

总结

虽然 JNI 可以实现 Node.js 和 Java 之间的直接通信,但这种方法较为复杂且不常用。更常见的是使用进程间通信(IPC),通过 Node.js 启动一个 Java 进程,并通过标准输入输出(stdin/stdout)进行数据交换。这种方法简单易用,适用于大多数文件处理场景。

如果你确实需要使用 JNI,可以考虑使用一些封装好的库,如 node-java,但请注意,这将引入额外的复杂性。


JNI是进程级的,JAVA通过JNI加载其他语言的二进制类库,反向不能实现。 Nodejs调JAVA,效率低,简单,可以走HTTP协议;效率高,略复杂,用Thrift ,走socket协议。

如果java程序常驻,可以用ZeroMQ、RabbitMQ之类通信

数据库是c++写的,nodejs跟c++数据库是怎么通信的? 如果没有编码接口,就通过TCP。nodejs跟数据库正是这样做的。

– 你可以用java写个服务器程序,监听端口 (正如c++写个数据库,监听端口) – nodejs把客户端请求转发给java服务器 – java服务器处理完毕,返回给nodejs响应 – nodejs把结果再返回给客户端

调用Java程序:

  • 只需一次调用还是要多次交互?
  • Java应用的输入和输出是如何定义的?

淘宝的不是实现了 hession 的协议解析了么

Node.js 调用 Java 程序进行文件处理并不直接支持 JNI(Java Native Interface),因为 JNI 主要是用于 Java 和 C/C++ 之间的本地代码互操作。但是你可以通过一些间接的方法来实现 Node.js 和 Java 的通信。

一种常见方法是使用 Node.js 调用 Java 应用程序的命令行接口,即通过子进程的方式调用 Java 程序。这样可以将文件处理任务交给 Java 程序,然后通过输入/输出流读取结果。

示例代码

  1. Java 端:创建一个简单的 Java 程序,该程序从标准输入读取文件路径,并对文件进行处理后将结果输出到标准输出。
// FileProcessor.java
import java.nio.file.Files;
import java.nio.file.Paths;

public class FileProcessor {
    public static void main(String[] args) throws Exception {
        String filePath = System.console().readLine("Enter file path: ");
        String content = new String(Files.readAllBytes(Paths.get(filePath)));
        // 文件处理逻辑
        String processedContent = content.toUpperCase(); // 仅作为示例
        System.out.println(processedContent);
    }
}
  1. Node.js 端:启动 Java 程序并与其通信。
const { execFile } = require('child_process');
const fs = require('fs');

// 假设你已经编译了 FileProcessor.java 并生成了 FileProcessor.jar
const javaPath = 'java';
const javaArgs = ['-jar', 'path/to/FileProcessor.jar'];

execFile(javaPath, javaArgs, (error, stdout, stderr) => {
    if (error) {
        console.error(`Error executing Java program: ${stderr}`);
        return;
    }
    console.log(`Processed file content: ${stdout}`);
});

// 为了将文件内容传递给 Java 程序,你需要修改 Java 程序以接受文件路径或内容作为参数。

这种方法虽然不是直接使用 JNI,但它提供了 Node.js 和 Java 之间简单且有效的方法进行交互。你也可以考虑使用其他方式如 HTTP API、消息队列等更复杂的解决方案来实现两者间的通信。

回到顶部