package testfile;import java.io.*;
public class TestIO {
    public TestIO() {
    }    public static void main(String[] args) {
        TestIO testio = new TestIO();
        String FileName="d:\\javawork";
        File myFile=new File(FileName);
        if(!myFile.exists()){
            System.err.println("Can't Find "+FileName);
            return;
        }
        System.out.println("File "+FileName+ " is "+myFile.length()+" bytes Long !");
        if(myFile.isDirectory()){
            System.err.println("File "+FileName+" is a Directort !");
            return;
        }
    }
}
运行的结果为 : 
D:\Borland\JBuilder2006\jdk1.5\bin\javaw -classpath "D:\javawork\testFile\classes;D:\Borland\JBuilder2006\jdk1.5\lib\dt.jar;D:\Borland\JBuilder2006\jdk1.5\lib\tools.jar;D:\Borland\JBuilder2006\jdk1.5\lib\htmlconverter.jar;D:\Borland\JBuilder2006\jdk1.5\lib\jconsole.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\javaws.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunjce_provider.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\localedata.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunpkcs11.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\dnsns.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\plugin.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\deploy.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\thaiim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\indicim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\charsets.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jsse.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\rt.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jce.jar"  testfile.TestIO 
File d:\javawork is a Directort !
File d:\javawork is 0 bytes Long !
Debug的结果为:
D:\Borland\JBuilder2006\jdk1.5\bin\javaw -classpath "D:\javawork\testFile\classes;D:\Borland\JBuilder2006\jdk1.5\lib\dt.jar;D:\Borland\JBuilder2006\jdk1.5\lib\tools.jar;D:\Borland\JBuilder2006\jdk1.5\lib\htmlconverter.jar;D:\Borland\JBuilder2006\jdk1.5\lib\jconsole.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\javaws.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunjce_provider.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\localedata.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\sunpkcs11.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\ext\dnsns.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\plugin.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\deploy.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\thaiim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\im\indicim.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\charsets.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jsse.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\rt.jar;D:\Borland\JBuilder2006\jdk1.5\jre\lib\jce.jar"  -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=TEST_Z:4936,suspend=y testfile.TestIO 
File d:\javawork is 0 bytes Long !
File d:\javawork is a Directort !

解决方案 »

  1.   

    原因在于使用System.out的时候,打印数据的线程和运行我们的程序的线程实际上不是同一个。到底谁先执行不是我们的程序可以控制的。所以,如果两个打印的语句执行的debug的时候,时间间隔很短,就有可能顺序颠倒。而在debug的时候,由于每一步的执行时间间隔比run状态的要长,可以确保两个打印语句的实际执行顺序。
      

  2.   

    “如果两个打印的语句执行的debug的时候”应该是“如果两个打印的语句执行的时候”
      

  3.   

    将System.err.println改为System.out.println就正常了.依原有err的处理, 我本地:
    未设断点时:
    File   d:\javawork   is   a   Directory   !
    File   d:\javawork   is   0   bytes   Long   !设断点步进时:
    File   d:\javawork   is   0   bytes   Long   !
    File   d:\javawork   is   a   Directory   !关注!
      

  4.   

    不同意2楼的观点, 我不设置断点连续运行十次, 就会出现十次:
    File       d:\javawork       is       a       Directory       ! 
    File       d:\javawork       is       0       bytes       Long       ! 
    而不是随机顺序输出.差异在于一个是out, 一个是err, 另:out的操作是同步操作, 而非异步.
      

  5.   

    我说的也是err,手顺写错了。正是因为err是异步执行,所以在当两个打印语句放在一起执行的时候,如果时间间隔很短,才会有可能顺序乱掉
      

  6.   

    5楼的朋友能讲出 为什么在运行程序时 system.err 会比system.out 先打印出来.(system.err 在system.out语句的后面啊). 还是比较迷惘!!!
      

  7.   

    out输出是带缓冲的
    带缓冲不会立即输出, 会等到缓冲满, 或者被调用System.out.flush()才输出.
    你试试在System.out.println 后面跟一个 System.out.flush()