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

Tyrion2017 2015-10-17 04:23:23
当在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();

...全文
277 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjxtju 2015-10-18
  • 打赏
  • 举报
回复
我感觉是这样子的。 Process p = Runtime.getRuntime().exec("cmd.exe /c " + “D:/1.jpg”); int exitValue = p.waitFor(); 等待的是cmd程序,cmd调用完图片打开程序打开图片后,自己就结束了,然后代码向下执行。 要实现等待,应该需要直接指定打开图片的程序如图片浏览器。 想不限定为打开图片文件, 思路一:也许该通过注册表取得文件对应的程序,但局限于windows,linux好像是根据文件的magic number取得文件类型的。 思路二:也许有系统调用能直接返回文件对应的打开程序。 思路三:cmd线程调用其他程序打开文件,这个程序的线程号也许可以通过线程之间的关系取得,然后直接wait这个新线程。 没做过。瞎猜。
Tyrion2017 2015-10-18
  • 打赏
  • 举报
回复
楼上这种方法,我也找到了,确实可以。但是却只能针对图片格式。我需要一种通用的方式,针对任何一种格式的文件都正确,而不仅仅是图片而已。 还有,那种方法对某些格式的文件不能正常工作的原因是什么,如何解决?
imfang 2015-10-18
  • 打赏
  • 举报
回复
改成下面的方法可以执行成功~~~ 可以结贴了 Process p = Runtime.getRuntime().exec("c:\\windows\\System32\\rundll32.exe \"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\", ImageView_Fullscreen D:\\e\\001.jpg");
Tyrion2017 2015-10-17
  • 打赏
  • 举报
回复
中间说错一句话: 但对于某些格式的文件,比如.jpg格式,p.waitFor();并没起作用。 p.waitFor();确实起作用了,进程p确实正常退出了。但对于以上两种情况,进程的生命周期却不一致。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧