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之类的。