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

本文介绍了一种简单的方法,即通过C#创建子进程调用命令行来执行Java应用程序,无需复杂的类封装。此外,还详细展示了如何通过命令行参数和重定向实现C#与Java之间的数据交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值