在Java中调用Python函数:基于socket的方法

最近想写一个算法,考虑到执行效率和开发效率,准备使用Java来实现,不过在算法执行过程中我打算使用基于pytorch的神经网络,此时就涉及如何在Java语言中执行Python程序。

最简单的想法当然就是直接使用命令行调用:Runtime.getRuntime().exec("python xxx.py --yyy zzz"),但是这种方式每次调用python脚本都需要重启python解释器以及重新将pytorch神经网络加载进内存,如果调用频繁的话就会非常耗时,因此并不合适。

更好的方式是让两个程序通过网络来通信,python可以启动时加载好神经网络,之后就开一个socket服务等待请求,让java程序把参数通过socket发给python程序,然后python拿到参数后执行函数,再把返回值发送回java即可。python程序并不退出,因此就不需要重复神经网络的加载过程了。而且基于socket可以让java和python跑在不同的机器上。

Read More »

Windows中C语言与Java的汉字编码问题

你是否遇到过C语言或者Java程序中的汉字字符串输出为乱码的现象,也许你去查询过解决办法,得到的结论就是简单地把源码文件转换为GBK编码存储,然而并未深思其中的原因。本文会解释其原因以及正确的应对方式(不转换源码的编码)。首先明确本文的操作环境:Windows操作系统(中文)、C语言编译器为MinGW-GCC。下面给出两个示例程序:

// a.c(utf-8)
#include <stdio.h>

int main(void)
{
    printf("%s", "你好");
    return 0;
}
// a.java(utf-8)

public class a {
    public static void main(String[] args) {
        System.out.println("你好");
    }
}

以上源码文件均使用UTF-8编码,然后我们打开PowerShell,编译两个文件:gcc a.cjavac a.java,然后运行:.\a.exejava a,会发现输出的均不是“你好”,而是乱码的“浣犲ソ”。实际上,以UTF-8编码的“你好”和以GBK编码的“浣犲ソ”的二进制序列是一样的(E4 BD A0 E5 A5 BD),你发现其中端倪了吗?

Read More »