当前位置: 代码迷 >> J2SE >> 关于Runtime.getRuntime().exec()的有关问题
  详细解决方案

关于Runtime.getRuntime().exec()的有关问题

热度:54   发布时间:2016-04-23 19:37:20.0
关于Runtime.getRuntime().exec()的问题
当在java代码中调用第三方软件打开某个文件时,我只找到了Runtime.getRuntime().exec()这个函数。但这个函数用的时候遇到了个问题:主要是p.waitFor();这个函数。
当打开的文件时:.txt,.pdf,.rar等格式时是正确的,p.waitFor();确实第三方软件关闭时,才继续向下执行;但对于某些格式的文件,比如.jpg格式,p.waitFor();并没起作用。
我获得了p进程的返回值,对于以上几种打开文件的方式,p进程都是正常退出。
现在的表现是这样:Runtime.getRuntime().exec()返回的进程p,对于.txt等格式来说,指的时第三方软件从开始到关闭的整个周期;而对于.jpg格式的文件,p进程的生命周期仅仅是打开文件,即:打开了一个文件,p进程就结束了。

以下是代码,想达到的效果是:调用windows默认的图片查看器打开D:/1.jpg图片文件,当查看完关闭后,就把该文件删除。但是实际上,刚调用第三方程序打开文件,就直接删除了,结果就查看不了了。请问这是怎么回事?

另外,还有没有其他在java代码中打开第三方软件的方法?我只找到这一种。

try {
Process p = Runtime.getRuntime().exec("cmd.exe /c " + “D:/1.jpg”);
int exitValue = p.waitFor();
}  catch (Exception e) {
e.printStackTrace();
}

File file = new File("D:/1.jpg");
file.delete();


------解决思路----------------------
改成下面的方法可以执行成功~~~
可以结贴了

Process p = Runtime.getRuntime().exec("c:\\windows\\System32\\rundll32.exe \"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\", ImageView_Fullscreen   D:\\e\\001.jpg");
------解决思路----------------------
我感觉是这样子的。
Process p = Runtime.getRuntime().exec("cmd.exe /c " + “D:/1.jpg”);
            int exitValue = p.waitFor();
等待的是cmd程序,cmd调用完图片打开程序打开图片后,自己就结束了,然后代码向下执行。
要实现等待,应该需要直接指定打开图片的程序如图片浏览器。
想不限定为打开图片文件,
思路一:也许该通过注册表取得文件对应的程序,但局限于windows,linux好像是根据文件的magic number取得文件类型的。
思路二:也许有系统调用能直接返回文件对应的打开程序。
思路三:cmd线程调用其他程序打开文件,这个程序的线程号也许可以通过线程之间的关系取得,然后直接wait这个新线程。
没做过。瞎猜。
  相关解决方案