通过调用外部exe的方法实现c#调用java

原创
2018/09/03 16:22
阅读数 506

c#调用java的方法有很多种,但有时的需求是让java完成某个功能即可,无需进行类的封装等操作。此时,则可以采用命令行的方式完成任务。即:在java端,编写一个java应用程序,完成所需要的功能即可。然后,再在c#端,通过创建子进程调用命令行的方式调用编写的java应用程序。

以输出Hello World为例:

#HelloWorld.java

1 public class HelloWorld {

2 public static void main(String args[]) {

3 System.out.println("Hello World!");

4 }

5 }

在Java端实现后,先通过命令行将java编译为class文件:

#javac HelloWorld.java

此时,在目录下将生产HelloWorld.class文件。

然后再在命令行运行class文件,即可看到结果:

#java HelloWorld

这样,在c#中创建子进程,执行命令行程序"java HelloWorld"就能让java应用程序执行了。c#中是通过process类来实现命令行程序的调用,具体代码如下:

1  String _TargetPath = @"";

2 Process process = new Process();

3 process.StartInfo.WorkingDirectory = _TargetPath;

4 process.StartInfo.FileName = "java";

5 process.StartInfo.Arguments = "HelloWorld";

6 process.StartInfo.CreateNoWindow = true;

7 process.StartInfo.UseShellExecute = false;

8 process.StartInfo.RedirectStandardInput = true;

9 process.StartInfo.RedirectStandardOutput = true;

10 process.StartInfo.RedirectStandardError = true;

11

12 // 启动可执行文件

13 process.Start();

14

15 String output = process.StandardOutput.ReadToEnd();

16 process.WaitForExit();

17 process.Close();

18

19 System.Console.WriteLine(output);

其中_TargetPath是用来指定class文件所在的目录,即调用java程序的工作目录。

第4行,表示我们命令行要执行的是java命令。第5行是命令行输入的参数。

第6行是表示不显示命令行的窗口,因为要对命令的输入输出进行重定向。

第7行是表示不用系统默认的程序打开

接下来8-10行表示要重定向命令行的输入输出,通过这种方式,就能在c#程序里面模拟命令行中的输入以及获取程序的标准输出。

第13行是用来启动子进程执行命令。

第15行是用来获取命令行执行时的标准输出,将其保存到变量output中

第16行是等待子进程结束。

当然,也能将写的java程序打包为jar包,并在命令行中调用。

与java应用程序的数据交互方式有两种:

1、通过命令行传递参数的方式,即在main函数中,通过args访问。但是由于c#调用时,Arguments 参数的长度是受到限制的:

在 Windows Vista 和早期的 Windows 操作系统上,添加至进程全径的长度的参数长度必须小于 2080。 在 Windows 7 和更高版本,此长度必须小于 32699。

2、通过对子进程的输入输出重定向的方式,可实现c#与java应用程序的数据交互。

c#从控制台输出端读取数据 <----- java向控制台输出数据

上面的实例就是c#获取了java的标准输出。

c#向控制台输出数据 -----> java从控制台获取输入数据

在c#中,发送数据方法如下:

1 process.StandardInput.WriteLine("test");

在java中,读取输入数据方法如下:

1 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

2 String input = null;

3 try {

4         input = br.readLine();

5 } catch (IOException e) {

6         e.printStackTrace();

7 }

通过上面的方式即简单的实现了c#调用java的方法,通过重定向也能实现c#与java的数据交互。当然,这种方法不限于调用java应用程序,也可以实现windows命令的封装,比如ping / ipconfig之类的。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部