多语言编程——Java 进程类、JNI 和 IO
原文:https://www . geesforgeks . org/多语言-编程-Java-进程-类-jni-and-io/
顾名思义,多语言编程涉及在一个程序中使用多种编程语言。有大量的编程语言,这是一种常见的体验,我们希望我们也可以使用其他语言的组件。嗯,开始的时候,使用多种语言,用多种语言编译代码似乎很奇怪,但最终,它非常有用。
在深入探讨细节和基于代码的东西之前,让我们回顾一下编程语言的历史 Java 的历史和操作系统的历史。汇编级编程语言诞生于 20 世纪 40 年代。1951 年的今天,区域汇编语言出现。1958 年——ALGOL;1959 年——COBOL(面向公共业务的语言),最后是 BASIC(初学者通用符号指令代码),1964 年。最后,我们在 1972 年拿到了 C。Python 出现于 1990 年,但由于数据科学和机器学习技术的出现,它只是在现在才流行起来。Java 诞生于 1995 年。其他语言如 Go、Rust、Dark、Kotlin、Swift、Scala、Scratch 等。都是最近的发展。我为什么要说这些?这看似与讨论的主题无关,但实际上并非如此。
不同的编程语言有不同的能力,这是可以接受的。比如 C 和 C++支持指针;Python 对数据科学和基于 AI 的领域有好处;r 适合数据分析和数学运算。从我的个人经历来看,BASIC 是我在 2011 年使用的第一种语言。(我主要用的是 QBASIC)。虽然 QBASIC 是一种解释语言,但我后来转向了 QB64,这是 BASIC 的现代化版本,它主要编译并生成一个 EXE 文件。除此之外,有时我们也使用机器可执行脚本来实现某些目标。例如,切换电脑蓝牙的 bash 脚本、与连接的外设通信的 bat 文件等等。
现在,可能有些时候你会说,“天哪!我希望语言 X 的这个特性也存在于语言 Y 中。”很多时候我们都面对过。但是现在,借助 Java 中的 Process 类、JNI 和 IO,我们可以访问 Java 中任何编程语言的特性,前提是机器上已经安装了相同的特性以及依赖项。例如,我们可以使用 Python OpenCV 或 java 中的 Python 文本到语音(PyTTSx3)库。
实施:
一个从 Java 运行文本到语音引擎的短程序。它由两个文件组成,即 python 的 tt.py 和 java 的 GFG.java。
文件 1:TTS . py
T5】python 3
# Python Demo Program
# System for reading command line arguments
import sys
# Our Text to speech module
import pyttsx3
if __name__ == "__main__":
engine = pyttsx3.init()
# Command line inputs saved in arg
for arg in sys.argv[1:]:
# Speaking the input
engine.say(arg)
engine.runAndWait()
文件二:GFG.java
T4
爪哇
T7
// Java Program to Run a Text to Speech Engine
// Importing I/O classes
import java.io.*;
// Main class
class GFG
{
// Main driver method
public static void main(String args[])
{
// Custom input string consisting of text to speak
String str= "Hello world";
// Try block to handle the exceptions
try
{
Process ec=Runtime.getRuntime().exec("python tts.py "+str); //Using str as command line argument for the python script
ec.waitFor(); //Waiting for the python script to finish executing
}
catch(Exception excep)
{
excep.printStackTrace();
}
}
}
T8T10】
输出:
Hello world (spoken)
好了,现在来看定义,
“processbuilder . start()和 Runtime.exec 方法创建一个本机进程,并返回一个 process 子类的实例,该实例可用于控制该进程并获取有关它的信息。”
–文档
实施:
可以看到,我们可以将控制流从 java 应用程序转移到 python 脚本,在脚本执行完成后,控制流被返回。现在,问题是除了控制流之外,如何传输数据。在这里,输入输出类开始发挥作用。
从 python 程序中,我们可以将我们想要的数据打印到 STDOUT 中。(使用 python 中的简单 print()函数。)现在,Process 类的实例 ec 有一个名为 getInputStream() 的函数。这将为 Java 程序返回一个 InputStream 对象。现在,来自输入流的输入可以很容易地用 BufferedReader 或 Scanner 类来处理。Python 类的标准输出连接到流程类实例的输入流。
示例 1: 文件:TTS . py
T5】python 3
# Importing required python classes
import sys
import pyttsx3
if __name__ == "__main__":
engine = pyttsx3.init()
# Iterating over using for loop
for arg in sys.argv[1:]
engine.say(arg)
engine.runAndWait()
# Print to STDOUT of python script
print("Execution from Python completed")
示例 2: 文件 GFG.java
T3
Java
T6T8】
// Importing java I/O classes
import java.io.*;
// Main class
class GFG {
// MAin driver method
public static void main(String args[])
{
// Custom input string
String str = "Hello world";
// Try block to check for exceptions
try {
// Creating object of Processor class for python
// script
Process ec = Runtime.getRuntime().exec(
"python tts.py " + str);
// Taking input from user by
// creating object of BufferedReader class
// as for less salalbilty it is fast
// Connect STDOUT of Python script to
// BufferedReader of Java
BufferedReader br = new BufferedReader(
new InputStreamReader(ec.getInputStream()));
// Initially declaring and initializing empty
// string
String st = " ";
// Read all outputs from python script
while ((st = br.readLine()) != null) {
// Printing them
System.out.println(st);
}
ec.waitFor();
}
// Catch block to handle the exceptions
catch (Exception excep) {
// Print the exception/s along twith line number
// using pprintStacktrace() method
excep.printStackTrace();
}
}
}
版权属于:月萌API www.moonapi.com,转载请注明出处