Java调用bat脚本时进程卡死?这招让exec()秒跑起来
Java调用批处理或可执行文件编写Java应用之际, 有时候会有在程序里调用另外一个已然存在的可运行程序或者系统命令的需求, 此时能够借助Java所给予的类与类的方法相互组合达成, 以下是一种颇为典型的程序模式:... .().exec(.\\p.exe);.( );...上面程序里, 第一行的“.\\p.exe”是那要被执行的程序名, .( )返回当前应用程序的对象, 此对象的exec( )方法指示Java虚拟机去创建一个子进程来执行指定的可执行程序, 还返回与该子进程对应的对象实例。借助它能够控制该子进程的执行或者获取该子进程的信息。第二条语句的目的是等待子进程完成之后再往下执行。但于平台之上, 设若处理有所不妥, 有时便无法获取预期之结果。下述乃是笔者于实际编程期间所归纳的几种需加以留意的情形:1、执行DOS的内部命令要是打算施行一条DOS内部命令, 存在两种办法。其一办法是将命令解释器涵盖于exec()的参数里头。举例来说, 执行dir命令, 在NT环境下, 能够写成exec(cmd.exe /c dir), 在95/98系统状况下, 可行成写作“.exe /c dir”, 这里面参数“/c”意味着命令执行完毕后马上关闭Dos窗口。另一办法是, 把内部内部命令放置于一个批命令.bat文件当中, 在Java程序里写成exec(.bat)。即使单单写成exec(dir), Java虚拟机也会报运行时错误。前一种办法为保障程序的可移植性, 要在程序里读取运行的操作系统平台, 进而调用不同的命令解释器。后一种方法呢, 无需做更多的处理。2、打开一个不可执行的文件开启一个并非可执行的文件, 不过该文件存在与之挂钩的应用程序, 那么便能够有两种途径。以开启一个Word文档a.doc文件作为举例, 在Java里能够有下面这两种写法:exec(start .\\a.doc);执行, “c:\”, “文件”, “\\”, “.\exe”, “.\a.doc”。显然前一种方法更为简捷方便。3、执行一个有标准输出的DOS可执行程序于平台之上, 运行那被调用程序的DOS窗口, 在程序执行完毕之后, 常常并不会自行关闭, 进而致使Java应用程序阻塞于( )。致使此现象出现的一个有可能的缘由是, 该可执行程序的标准输出数量较多, 然而运行窗口的标准输出缓冲区规模不够大。解决的办法为, 凭借Java所提供的类给出的方法, 让Java虚拟机截获被调用程序的DOS运行窗口的标准输出, 在( )命令之前, 将窗口的标准输出缓冲区里面的内容读取出来。一段典型的程序如下:...ls_1;赋值等于, 执行的内容是, 通过执行命令行, 执行“cmd /c dir \”, 并以此进行调用执行操作。 new ( \new (.());while ( (ls_1.()) ! null).out.(ls_1);.( );今天进行着客户端程序的自动更新, 简要地描述一番, 便是从中服务器那里把更新包给下载下来, 之后于本地实施解压缩, 最终将其删掉, 功能是挺简单的~然而, 问题在于, 运用 JAVA 的 ZIP 模块来进行文件的解压缩, 并非如想象那般简易, 资源是需要进行释放的, 一不小心就无法把原有的 ZIP 文件给删除掉了, 资源的占用着实是个重大问题, 不过好在, 客户端程序更新完成后是要重启的, 如此一来一切都消散如烟了, 对于无法删除 ZIP 文件这一问题, 我也采取比较强硬的方式, 使用 DEL 进行强行删除, 在此处务必得留意等于执行, 通过命令行执行, 删除指定路径内的指定文件。即将使用命令行执行删除操作, 在那特定的路径下, 删除那个特定的文档。这样的调用是没有问题~什么什么等于什么, 用括号括起来, 执行删除操作, 删除F 盘下的aaa.doc文件。这样写是不可能对的~用Java调用Dos命令时直接用以下命令就可以完成ping 192.168.1.1;.().exec();且能够运用类的方法去获取输出结果, 然而, 我于调用一些工具软件的Dos命令之际却出现了状况, 输出结果仅仅能够获取到前面的一少部分, 经过测试发觉, exec之后没过多久, Java便认定这个进程已然结束了, 并即刻着手执行后续的操作, 可此时实际上并未结束, 只是因流的关闭而被强行中断了。之后采用了同事所介绍的办法, 把那些Dos命令全都放置于一个批处理文件里, 并且使用。cmd /c start d:\\wmv.bat得以采用的办法去调用要是不添加cmd /c的话, 执行同样会出现错误状况, 如此这般下来, Java仅仅是重新启动了一个进程去开展批处理的执行, 并不会去留意进程是否已经结束, 而是径直开始执行后续的语句。但如此一来, 仍旧存在一个问题, 那便是Java跟这个批处理没办法展开交互, 我尝试过了其中的()以及()方法, 它们都是于网上讲到的能够用以判断进程是否完结的方法, 然而均无法起到作用, 常常是进程已然结束了, 可是Java仍旧觉得没有结束, 或者居然是Java觉得停止了, 不过进程其实还在运行当中。

相关新闻

最新新闻

日新闻

周新闻

月新闻