各位好,请看代码package com.scott.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/**
*
* @author xjqin 2010-3-12
* @describe 这个是一个封装了的一个运行环境
*/
public class RunTimeInfo {
private BufferedReader input = null;
private BufferedReader error = null;
private String command = "";
private StringBuffer inputInfo = new StringBuffer();
private StringBuffer ErrorInfo = new StringBuffer();;
private Process Process = null;
private int exitValue = 0 ;
public RunTimeInfo(String Command) {
try {
this.command = Command;
init();
} catch (IOException e) {
e.printStackTrace();
}
}
private void init() throws IOException
{
this.Process = Runtime.getRuntime().exec(this.command);
this.input = new BufferedReader(new InputStreamReader(this.Process.getInputStream()));
this.error = new BufferedReader(new InputStreamReader(this.Process.getErrorStream())); String line = "";
while ((line = this.input.readLine()) != null) {
inputInfo.append(line).append("\n");
}
input.close();
while ((line = error.readLine()) != null) {
ErrorInfo.append(line).append("\n");
}
error.close();
try {
this.Process.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.Process.destroy();
System.out.println("------");
this.exitValue = this.Process.exitValue();
} public final String getCommand() {
return command;
} public final void setCommand(String command) {
this.command = command;
} public final BufferedReader getError() {
return error;
} public final void setError(BufferedReader error) {
this.error = error;
} public final StringBuffer getErrorInfo() {
return ErrorInfo;
} public final void setErrorInfo(StringBuffer errorInfo) {
ErrorInfo = errorInfo;
} public final int getExitValue() {
return exitValue;
} public final void setExitValue(int exitValue) {
this.exitValue = exitValue;
} public final String getInput() {
return input.toString();
} public final void setInput(BufferedReader input) {
this.input = input;
} public final String getInputInfo() {
return inputInfo.toString();
} public final void setInputInfo(StringBuffer inputInfo) {
this.inputInfo = inputInfo;
} public final Process getProcess() {
return Process;
} public final void setProcess(Process process) {
Process = process;
}}/**
*
*/
package com.scott.test;
/**
* @author 53 2010-3-12
* @describe 测试运行类
*/
public class RuntimeTest { public static void main(String args[]) {
String command = "cmd.exe /c rmdir /s/q D:\\PAMS_DOC\\OutPut";
RunTimeInfo info = new RunTimeInfo(command);
int exitValue = info.getExitValue();
String errorInfo = info.getErrorInfo().toString();
System.out.println("退出值" + exitValue);
System.out.println("错误信息" + errorInfo);
}}由于该段程序时在web系统上面的一个按钮触发执行的
意为:删除windows系统上的某个文件夹
但是遇到这样的问题:
1.在我第一次触发事件的时候,删除失败,原因是文件打开状态中
2.以后的触发事件,提示的语言都是文件被其他进程所使用,所以我在第一段程序process.destroy()之后添加了System.out.println("------");但是发现程序没有打印出------,估计是没有执行到这里.
是不是因为某种原因让该进程没有销毁掉?
是不是因为前面清除文件的命令是阻塞的,导致不成功后后边的程序无法进行?
但是感觉也不对啊,命令运行后错误信息都已经显示出来了,还是阻塞的吗?注意了:是在web上面遇到的这个问题望高手解答,谢谢!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/**
*
* @author xjqin 2010-3-12
* @describe 这个是一个封装了的一个运行环境
*/
public class RunTimeInfo {
private BufferedReader input = null;
private BufferedReader error = null;
private String command = "";
private StringBuffer inputInfo = new StringBuffer();
private StringBuffer ErrorInfo = new StringBuffer();;
private Process Process = null;
private int exitValue = 0 ;
public RunTimeInfo(String Command) {
try {
this.command = Command;
init();
} catch (IOException e) {
e.printStackTrace();
}
}
private void init() throws IOException
{
this.Process = Runtime.getRuntime().exec(this.command);
this.input = new BufferedReader(new InputStreamReader(this.Process.getInputStream()));
this.error = new BufferedReader(new InputStreamReader(this.Process.getErrorStream())); String line = "";
while ((line = this.input.readLine()) != null) {
inputInfo.append(line).append("\n");
}
input.close();
while ((line = error.readLine()) != null) {
ErrorInfo.append(line).append("\n");
}
error.close();
try {
this.Process.waitFor();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.Process.destroy();
System.out.println("------");
this.exitValue = this.Process.exitValue();
} public final String getCommand() {
return command;
} public final void setCommand(String command) {
this.command = command;
} public final BufferedReader getError() {
return error;
} public final void setError(BufferedReader error) {
this.error = error;
} public final StringBuffer getErrorInfo() {
return ErrorInfo;
} public final void setErrorInfo(StringBuffer errorInfo) {
ErrorInfo = errorInfo;
} public final int getExitValue() {
return exitValue;
} public final void setExitValue(int exitValue) {
this.exitValue = exitValue;
} public final String getInput() {
return input.toString();
} public final void setInput(BufferedReader input) {
this.input = input;
} public final String getInputInfo() {
return inputInfo.toString();
} public final void setInputInfo(StringBuffer inputInfo) {
this.inputInfo = inputInfo;
} public final Process getProcess() {
return Process;
} public final void setProcess(Process process) {
Process = process;
}}/**
*
*/
package com.scott.test;
/**
* @author 53 2010-3-12
* @describe 测试运行类
*/
public class RuntimeTest { public static void main(String args[]) {
String command = "cmd.exe /c rmdir /s/q D:\\PAMS_DOC\\OutPut";
RunTimeInfo info = new RunTimeInfo(command);
int exitValue = info.getExitValue();
String errorInfo = info.getErrorInfo().toString();
System.out.println("退出值" + exitValue);
System.out.println("错误信息" + errorInfo);
}}由于该段程序时在web系统上面的一个按钮触发执行的
意为:删除windows系统上的某个文件夹
但是遇到这样的问题:
1.在我第一次触发事件的时候,删除失败,原因是文件打开状态中
2.以后的触发事件,提示的语言都是文件被其他进程所使用,所以我在第一段程序process.destroy()之后添加了System.out.println("------");但是发现程序没有打印出------,估计是没有执行到这里.
是不是因为某种原因让该进程没有销毁掉?
是不是因为前面清除文件的命令是阻塞的,导致不成功后后边的程序无法进行?
但是感觉也不对啊,命令运行后错误信息都已经显示出来了,还是阻塞的吗?注意了:是在web上面遇到的这个问题望高手解答,谢谢!
解决方案 »
- 在JAVA中怎么判断两个字符数组相等?有函数吗?
- 为什么我的jdk 安装完了怎么demo文件中图标怎么不会变呢?
- 这段java代码谁能帮我写成delphi代码
- 为什么我编译不出来了`
- 非法的表达式开始,需要;,需要}
- 【请教】问一个关于时间的怪问题!
- 我在appletviewer里看到的显示很是重叠的,我怎么才能让它显示清楚呢?多谢大家了
- 怎么样在JTABLE上双击后弹出一个小窗口,比如密码校验那样的,急需,在线等待!谢谢!
- 内部类问题??????
- 呵呵,今天换了一家新地方,感觉比较满意,散分(2)
- 用JAVA取得LINUX系统的CPU使用率,关于LINUX版本问题(在线等)
- 纯jdbc连接access可以吗
public static void main(String[] args) {
Queue q=new Queue ();//new出一个q:后面的两个线程都是用的同一个q,保证一个put一个get
Producer p=new Producer (q);//让new出的p去往q里面put
Customer c=new Customer (q);//让new出的c从q中get
p.start();//p和q开始的顺序并不报错
c.start();
}
}
class Producer extends Thread
{
Queue q;
public Producer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的put方法
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
q.put(i);//此处只是让q去put 10次
System.out.println("Producer put "+i);//并且输出本次放的是第几杯
}
}
}
class Customer extends Thread
{
Queue q;
public Customer(Queue q) {
this.q=q;//给成员变量赋值,再一调运q的get方法
}
@Override
public void run() {
while (true) {//死循环:只要q里面有,就去get
//get方法有返回值,返回值就是producer所put的数量
//此处也不需要去考虑是第几杯
//在Queue中的value解决可这一问题:
//put中的I赋给value,get方法有返回值就value的值
System.out.println("Customer get "+q.get());
//如果循环完了,就跳出循环,否则线程不会自己结束
if (q.value==9) {
break;
}
}
}
}
class Queue
{
int value;
boolean bFull=false;
public synchronized void put (int i)//在producer中的put方法中就是将其I传进来
{
if (!bFull) {//条件为真(如果没满,就倒水)
value=i;//给value赋值,现在有几杯水
bFull=true;//满了
notify();//唤醒其他线程(让customer去get)
}
try {
wait();//告诉customer去get后自己等待customer的get结束
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public synchronized int get()
{
if (!bFull) {//如果没满就等待,如果满了就不进 **这就是为什么main里面谁先开始不报错的原因**
//get和put方法中的if条件判断起到了至关重要的作用
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
bFull =false;//赋值为没满
notify();//唤醒producer去put
return value;//get的返回值就是put的时候给value赋的值
}
}
读不到数据的话直接就返回为空了.怎么会死在这里的呢?
destory taskkill
Google下 就知道了