http://community.csdn.net/Expert/topic/3165/3165480.xml?temp=.5368158
以上是我前不久问的一个问题,是Runtime.getRuntime.exec()执行太久后出现的问题。
现在遇到是执行太快遇到的问题。
情况如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class RuntimeTest 
{
public static void main(String[] args)
{
try
{
Process process=Runtime.getRuntime().exec("/mnt/d/bk/test");
BufferedReader br=new BufferedReader(new InputStreamReader(process.getInputStream()));
while(br.readLine()!=null)
{

}
process.waitFor();
System.out.println(process.exitValue());
}
catch(Exception e)
{

}
}
}其中test中的内容是:
#!/bin/sh
exit 99可是执行结果打印出来是0,实际应该是99啊!
修改test为
#!/bin/sh
sleep 0.01
exit 99打印结果就是99了,这是怎么回事?

解决方案 »

  1.   

    我在Windows系统下改写test文件为test.bat
    exit 99
    可是结果其却和在Linux中不同,可以得到99
      

  2.   

    你是在P4的机器上碰到这个问题的吗?
    P4,Redhat 7.2,JDK build 1.4.1-b21
    我在上述平台上也碰到了这个问题,在Linux启动后,第一次执行
    JAVA程序时,返回值正确,以后似乎是随机出现0和正确的值。
    但在P3的机器上就没有问题。
    使用JDK1.5来编译程序再运行也没有问题。
    你可以参考一下。
      

  3.   

    是的,我的机器也是P4
    基本配置是这样的:
    P4,Redhat9.0,JDK 1.4.1
    那我到其它平台试试看
      

  4.   

    我在win2000和linux下都试过了,好像都没有问题呀。
    输出都是:99,正如预期的!
      

  5.   

    To: takecare(大厅) ( ) 
    不用sleep 0.01也能输出99? 我昨天还在Redhat9.0中试了一下,还是0 
    :(
      

  6.   

    改成这样试试看>test.bat
    haha
    exit 99>RuntimeTest.java
    public class RuntimeTest { public static void main(String[] args) {
    try {
    Process process=Runtime.getRuntime().exec("test.bat");
    StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");            
            
            // kick off stderr
            errorGobbler.start();
            
            StreamGobbler outGobbler = new StreamGobbler(process.getInputStream(), "STDOUT");
            // kick off stdout
            outGobbler.start();
            
    process.waitFor();
    System.out.println(process.exitValue());
    } catch(Exception e) {}
    }
    }
    >StreamGobbler.java
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.PrintWriter;public class StreamGobbler extends Thread {
    InputStream is;
    String type;
    OutputStream os;
        
    StreamGobbler(InputStream is, String type) {
    this(is, type, null);
    }    StreamGobbler(InputStream is, String type, OutputStream redirect) {
            this.is = is;
            this.type = type;
            this.os = redirect;
        }
        
        public void run() {
            try {
                PrintWriter pw = null;
                if (os != null)
                    pw = new PrintWriter(os);
                    
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line=null;
                while ( (line = br.readLine()) != null) {
                    if (pw != null)
                        pw.println(line);
                    System.out.println(type + ">" + line);    
                }
                if (pw != null)
                    pw.flush();
            } catch (IOException ioe) {
                ioe.printStackTrace();  
            }
        }
    }
      

  7.   

    截获所有的输出信息看看,到底是什么错误?
    因为可能是环境的问题,我这里不能重现你那里的现象。----linux
    我测试的jdk
    java version "1.4.2_05"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_05-b04)
    Java HotSpot(TM) Client VM (build 1.4.2_05-b04, mixed mode)linux核心:2.4.18。
    CPU:赛杨1.7----windows 2000
    j2sdk1.4.2_02
    P4 2.8E以上两个平台都是对。
      

  8.   

    j2sdk1.4.1,我改成将sdk1.4.2看看
    StreamGobbler类中没有start()方法?
      

  9.   

    上面是我错了,没有加extends Thread
    刚才我看了一本电子书《More Java Pitfalls》,和有你提供的一样的例子
      

  10.   

    我用你上面的方法试了一下,还是和我原来一样的环境,在Linux中
    test.sh
    exit 99当我编译后运行四次,结果如下:
    [dexiang@localhost test]$ java RuntimeTest
    99
    [dexiang@localhost test]$ java RuntimeTest
    99
    [dexiang@localhost test]$ java RuntimeTest
    0
    [dexiang@localhost test]$ java RuntimeTest
    0
    ×××××××××××××××
    这是为什么?
      

  11.   

    妖了!
    java -version
    看看到底运行的是什么版本的jdk或者jre。
      

  12.   

    java version "1.4.1_01"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_01-b01)
    Java HotSpot(TM) Client VM (build 1.4.1_01-b01, mixed mode):(
      

  13.   

    谢谢takecare(大厅) 的帮助!
      

  14.   

    我把Linux系统上的jdk换成 j2sdk-1_4_2_05 就可以了!
      

  15.   

    靠!真是搞不懂了,还有这等事情。同情你!解决了就好!庆祝!
    不过我也曾经碰到过类似的ibm的jdk1.3在多cpu下,只要运行javac、java、javaw就会出现3个以上的java或javaw进程。不过只有在一台由客户自己安装的机器上才会出现,我们自己的服务器上就没有。像碰到这种妖怪,也真是没辙!
      

  16.   

    等一下测试一下
    http://community.csdn.net/Expert/topic/3165/3165480.xml?temp=.5368158
    中谈到的问题,如果可以的话就可以结贴了。
    不知道jdk1.5的情况会不会好点:(
      

  17.   

    To: takecare(大厅)
      
    都可以了:)