- 浏览: 67884 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
monkeyVon:
感谢楼主分享~不过有个地方有点错误,majorityCnt(c ...
《机器学习实战》3:决策树 -
liu765023051:
很好,感谢楼主分享了。
2013年11月15日-DWR的工作原理
有些时候我们需要在Java程序中调用一些exe程序或是脚本语言,例如.bat python 等。Java提供了Runtime对象及一些方法。
1、JAVA API:
首先,看一下Runtime的API:
Every Java application has a single instance of class Runtime that allows the application to interface with the environment in which the application is running. The current runtime can be obtained from the getRuntime method.
有两个方法需要说一下:
(1)public static Runtime getRuntime()
Returns the runtime object associated with the current Java application. Most of the methods of class Runtime are instance methods and must be invoked with respect to the current runtime object.
这个函数用来返回当前java应用程序的Runtime对象,是一个静态函数。用户可以通过类直接调用(Runtime.getRuntime())。
(2)用来执行脚本的函数
public Process exec(String command)throws IOException
Executes the specified string command in a separate process with the specified environment and working directory.
该方法用来执行字符串形式的系统命令,返回一个管理子进程的Process对象
(3)Process对象:该对象有以下几个方法,用来操作子进程
abstract void destroy()
Kills the subprocess.
abstract int exitValue()
Returns the exit value for the subprocess.
abstract InputStream getErrorStream()
Gets the error stream of the subprocess.
abstract InputStream getInputStream()
Gets the input stream of the subprocess.
abstract OutputStream getOutputStream()
Gets the output stream of the subprocess.
abstract int waitFor()
causes the current thread to wait, if necessary, until the process represented by this Process object has terminated.
2、使用方法:
Process p = null; try { p = Runtime.getRuntime().exec("notepad.exe"); } catch (Exception e) { e.printStackTrace(); } System.out.println("我想被打印...");
这样简单的运行第三方程序之后,会造成子进程还没有运行完,java程序就向下接着运行了。这对一些想等待第三方程序执行完的用户来说不合理,这里就要用到waitFor()方法。
在以上程序的.exec("")后,添加代码:
p.waitFor();
但是,这样会出现必须要等我们把记事本关闭打印语句才会被执行。并且你不碰手动关闭它那程序就一直不动,程序出现了挂起的现象。看一下这个函数的API:
Causes the current thread to wait, if necessary, until the process represented by this Process object has terminated. This method returns immediately if the subprocess has already terminated. If the subprocess has not yet terminated, the calling thread will be blocked until the subprocess exits.
也就是说,等到当前的进程会等待子进程结束,如果子进程停止,该方法立即被返回。但是直接调用这个方法会导致当前线程阻塞,直到退出子进程。
产生阻塞的原因:因为本地的系统对标准输入和输出所提供的缓冲池有效,所以错误的对标准输出快速的写入何从标准输入快速的读入都有可能造成子进程的所,甚至死锁。好了,问题的关键在缓冲区这个地方:可执行程序的标准输出比较多,而运行窗口的标准缓冲区不够大,所以发生阻塞。接着来分析缓冲区,哪来的这个东西,当Runtime对象调用exec(cmd)后,JVM会启动一个子进程,该进程会与JVM进程建立三个管道连接:标准输入,标准输出和标准错误流。假设该程序不断在向标准输出流和标准错误流写数据,而JVM不读取的话,当缓冲区满之后将无法继续写入数据,最终造成阻塞在waitfor()这里。
3、解决程序挂起,查了网上说的,基本都是开启两个线程,读取进程的输出和错误内容。
代码如下:
public class TestProcess { /** * @param args */ public static void main(String[] args) { TestProcess test=new TestProcess(); test.openNotepad(); } public void openNotepad(){ try { Process p = Runtime.getRuntime().exec("notepad.exe"); StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "Error"); StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "Output"); //开启两个线程读缓冲区内容 errorGobbler.start(); outputGobbler.start(); p.waitFor(); p.destroy(); } catch (Exception e) { e.printStackTrace(); } } class StreamGobbler extends Thread { InputStream is; String type; StreamGobbler(InputStream is, String type) { this.is = is; this.type = type; } public void run() { try { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line = null; while ((line = br.readLine()) != null) { if (type.equals("Error")) System.out.println(line); else System.out.println(line); } } catch (IOException ioe) { ioe.printStackTrace(); } } } }
这个方法就解决了调用waitFor()方法阻塞无法返回的问题。
发表评论
-
Java内存模型笔记(一)
2017-02-17 14:05 0JVM内存模型:主内存和线程独立的工作内存 Java内存 ... -
Java面试题系列1
2015-01-22 22:02 0第一部分 JVM 和 内存模式 垃圾回收 第二部分 数据 ... -
面试中会问到的Java基础问题
2014-05-15 23:01 01 String/StringBuilder/StringBu ... -
Java——判断点是否在四面体内/立方体内
2014-03-10 14:16 44521、假设有一个四面体,四个顶点定义: V1 = (x1, ... -
java 求矩阵乘法及行列式的值
2014-03-10 11:19 5665最近用到矩阵的数学计算,写了两个简单的程序,贴在这里: 1、 ... -
养成良好的开发习惯(Java)
2014-03-05 10:13 01、使用Eclipse中的注释模板 打开Eclipse,有 ... -
Java设计模式——策略模式
2014-03-02 00:20 674《Thinking in Java》看了一大部分,发现其 ... -
Java学习笔记——数组
2014-01-05 12:56 686现在已经很少用到 ... -
Java学习笔记——持有对象
2013-12-14 16:53 685通常,在程序运行之前是不知道所需对象的类型及数量的,为解决 ... -
Java学习笔记——多态、接口、内部类
2013-12-08 23:31 564大部分内容都是摘自《Thinking in Java》 ... -
Java学习笔记——复用类
2013-12-02 23:50 928Java中实现代码复用的两 ... -
log4j的用法
2013-12-03 10:06 775在调试程序中最常用的 ... -
Java学习笔记——初始化和清理
2013-11-24 14:13 7091.构造器 (1)默认构造器:Java同样采用构造器的方式保 ... -
Java学习笔记——操作符
2013-11-20 23:06 721操作符对所有编程 ... -
ArrayList 的复制
2013-11-18 10:28 890今天在使用ArrayList的时候遇到一个问题,搞了 ...
相关推荐
在实际应用中,为了提高稳定性和健壮性,可以考虑使用第三方库,如Apache POI或JODConverter,它们提供了更高级别的抽象,能更好地处理文件转换和异常处理。同时,使用`ProcessBuilder`而非`Runtime.getRuntime()....
- **集成外部工具**:比如使用第三方的图形处理软件进行图片转换等。 - **系统管理操作**:如监控系统资源使用情况、重启服务等。 ### 二、示例代码详解 下面我们将针对给定的部分内容进行详细解读: ```java // ...
然而,通过第三方库如Jacob(Java和COM的桥梁),Java开发者能够在Java应用中与OCX控件进行交互。下面将详细介绍这一过程,以及涉及到的jar和dll文件。 Jacob是一个开源项目,它为Java提供了与COM接口交互的能力,...
为简化这个过程,我们可以借助一些第三方工具或库,如IKVM.NET。IKVM.NET是一个开源项目,它实现了Java虚拟机(JVM)并提供了.NET Framework与Java的互操作性。 **步骤一:安装IKVM.NET** 1. 下载IKVM.NET的最新...
- 安全考量:避免命令注入,可能使用Java内置库或第三方库进行证书管理。 - 数字证书和SSL/TLS协议的基础知识。 - Java与外部工具交互的最佳实践。 在实际开发中,确保正确、安全地处理证书和密钥是至关重要的,...
在Windows操作系统中,内置了微软的Speech API (SAPI) 和更现代的Windows Speech Platform,可以方便地被Java通过JNI(Java Native Interface)或者通过第三方库间接调用。下面将详细介绍如何实现这个功能。 首先,...
Java调用Python主要依赖于Jython、Apache Beam、Java的Runtime类或者通过第三方库如Jython-Interpeter。这里我们主要讨论使用Java的Runtime类和Jython。 1. **Java的Runtime类**:这是最基础的方法,通过Runtime....
`Runtime.getRuntime().exec()`方法是较早期的调用方式,而`ProcessBuilder`则是在Java 5之后引入的,提供更灵活的进程控制。 1. **使用Runtime.getRuntime().exec()** - 这个方法可以直接执行shell命令,如`"sh -...
总结来说,"使用Java调用Windows WIN脚本"涉及到Java与操作系统交互的关键技术,包括`Runtime`和`ProcessBuilder`的使用、理解批处理和VBS脚本的工作原理,以及通过第三方库如j-Interop来实现更复杂的操作,如调用...
在Java中调用SQL*Plus,通常有两种方式:一种是通过操作系统命令行(ProcessBuilder或Runtime类),另一种是使用第三方库如JDBC-ODBC桥接或者OCI驱动。 1. **使用操作系统命令行**: - 首先,确保你的系统环境变量...
在Java中,我们通常通过执行系统命令或者使用第三方库来调用FFmpeg。 首先,让我们理解如何在Java中执行FFmpeg命令。你可以使用`Runtime.getRuntime().exec()`方法来运行外部程序,例如FFmpeg。以下是一个简单的...
需要注意的是,这种方法依赖于第三方工具`nircmd.exe`,可能存在安全风险,因为任何能够提升权限的工具都可能被恶意使用。在生产环境中,你应该谨慎使用,并确保对代码进行充分的安全审计。 此外,Java 1.6及更高...
在Java编程中,有时我们需要执行一些系统级别的操作,如创建目录、...在实际项目中,如果频繁进行此类操作,建议使用Java的I/O和NIO库,或者第三方库如Apache Commons IO,它们提供了更为高级和安全的文件操作接口。
在Unity游戏引擎中,有时我们需要利用Android原生的Java代码来实现特定功能,例如访问硬件设备、使用系统API或者调用第三方库等。这需要通过Unity与Android之间的交互来完成,也就是所谓的Unity调用Android Java函数...
在Java中,如果需要处理SFTP操作,可以使用第三方库如JSch,它提供了Java API来实现SSH和SFTP的功能。例如,上传文件: ```java import com.jcraft.jsch.*; JSch jsch = new JSch(); Session session = jsch....
为了使代码更加健壮,可以考虑使用第三方库如`JAVE (Java Audio Video Encoder)`,它是一个Java封装了`ffmpeg`的库,提供了更友好的API,简化了在Java中使用`ffmpeg`的过程。不过,使用第三方库需要额外引入依赖,...
首先,Java中没有内置的直接访问硬件设备如摄像头的API,但可以通过JNI(Java Native Interface)或者第三方库来实现。OpenCV是一个广泛使用的计算机视觉库,它提供了跨平台的API,包括Java,用于处理图像和视频数据...
为了解决这个问题,我们可以借助第三方工具,如Quick Batch File (De)Compiler,将批处理文件转换为exe文件。这个工具允许我们将BAT或CMD文件编译成可执行文件,然后通过Java调用exe文件来间接执行批处理命令。例如...
在标签"源码"和"工具"的提示下,我们可以考虑提供一个完整的示例项目,包含导入导出数据库的相关源码,以及可能用到的一些工具库,比如Apache Commons Exec用于更方便地执行系统命令,或者使用第三方库如Flyway、...
这种技术允许开发者在Java应用中集成转换功能,无需额外安装第三方库或组件。 首先,VBScript是一种轻量级的脚本语言,常用于Windows环境中的自动化任务。它可以通过与操作系统进行交互,调用系统自带的程序和服务...