想实现一个动能:现在有2个封装好的项目(exe)A、B(都是swing写的).
那么希望运行A后通过事件触发来调用执行B,同时需要传递参数给B(exe文件).或者说每次运行A.exe后触发B.exe后,B.exe每次都更新数据。现在实现的一种方法就是:
执行A.exe,点击按钮触发B.exe,其中在调用执行B.exe前先把传递的参数写入到本地磁盘的某txt文件。然后调用执行B.exe,B.exe程序的main方法实现读取赋值的本地磁盘的txt文件。从而实现传递参数的效果。但是这并不能满足需求,有没有什么方法能高效的实现每次A.exe触发事件后B.exe都能读取显示到刚刚传递的参数(读取txt写入的内容)。现在如果要现在的话只能每次触发A.exe事件后先判断是否有B.exe进程,有的话就关闭重新开启B.exe,没有就直接运行B.exe。这是一种很不科学的做法。求各位支支招。多谢。贴出部分相关代码://A.exe
public static void openExes()//通过cmd dos命令调用执行B.exe
{
    Runtime rt=Runtime.getRuntime();
    Process p=null;
    try
    {   
     p=rt.exec("\"C:/Prices/B.exe\"");
    }
    catch(Exception ex)
    {
     ex.printStackTrace();
    } }
public static void main(String[] args) {
FileOperation fo=new FileOperation();//操作本地txt数据的类   --忽略
try
 {
   File file=new File("C:/message.txt");  
   fo.createFile(file); //创建txt
   fo.writeTxtFile("参数一"+"\r\n"+"参数二",file); //写入参数至txt
 }
 catch(Exception ex)
 {
 ex.printStackTrace();
 }
openExes(); //调用执行B.exe  
} //B.exeString user="";
String pwd="";
try
 {
   FileOperation fo=new FileOperation();
   File file=new File("C:/message.txt");//读取参数txt   
   String[] str=fo.read(file);
   user=str[0];
   pwd=str[1];
 }
 catch(Exception ex)
 {
 ex.printStackTrace();
 }
LoginFrame frame=new LoginFrame(user,pwd);
.............

解决方案 »

  1.   

    进程间共享数据的方法很多,找一种你觉得合适的,这个需要自己去判断哪一种更适合自己。
    1. 共享内存
    2. Socket
    3. 命名管道
    4. 写文件
    还有其他的暂时没什么概念了
      

  2.   

    命令行参数满足不了我的要求,现在初级测试是java与java之间的测试,但是一定会涉及到c++调用java的exe的。但是这些传参都需要兼容的。
      

  3.   

    我觉得最好使用Socket或者管道来做,兼容性、运行效率和开发效率都比较平衡。用文件的话可以看看nio.FileChannel的lock方法。楼主应该是比较有经验了,所以我就点到为止。
    nio的lock方法调用的是native lock函数(flock之类),所以应该是可以和其他语言兼容的。
    思路:
    一个读进程一个写进程对同一个文件操作;
    文件被分成若干指定大小的区块,并编号从0~N;
    写进程写入区块k完毕之后,先锁住区块k+1,再释放区块k;
    读进程读取区块k之后,立即尝试锁住区块k+1;
    当程序开始时,写进程必须先锁住区块0待写入,而读进程也是先尝试锁住区块0。如果无法控制进程开始的顺序,那么读进程需要轮询检测区块0是否有数据被写入,且不能长期持有锁。我觉得还是用socket比较方便。。
      

  4.   

    还是socket靠谱点 用其他的话很可能出现占用问题 java使用socket还是比较方便的
      

  5.   

    发布一个webservice,点击A调用webservice,传参数,webservice调用B。可以实现你的功能,并且以后可以兼容C#等
      

  6.   

    只有2中方案:Socket 和 共享文件数据。
    Socket方式: 让B作为服务端,监听端口,响应A传递过来的数据请求。
    文件方式:用到2个文件,一个文件用于存放要传递的数据,另一个文件用于表示数据文件的访问锁。详细介绍文件方式:
    1.无论A还是B想访问数据文件时,首先要查看锁文件是否存在,如果存在,说明该数据文件正在被他人使用,如果不存在,说明可以访问数据文件。
    2.访问数据文件之前,先创建锁文件,创建失败说明锁竞争,重新再试,或者抛出异常。数据文件访问完毕后,要删除锁文件。最后,如果B程序是要被其他进程启动,那么,B程序必须会自动结束,而不是一直执行的那种程序。