import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
public class Test0001 { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
ByteArrayOutputStream baoStream = new ByteArrayOutputStream(1024);
// cache stream
PrintStream cacheStream = new PrintStream(baoStream);
// old stream
PrintStream oldStream = System.out; System.setOut(cacheStream); System.out.println("1");
System.out.println("2");
String[] as = baoStream.toString().split("\n"); // Restore old stream
System.setOut(oldStream); System.out.print(as[0]);//①
System.out.print(as[1]);//②
}}
这是内段程序,不知为什么  只输出了一个  2  ,把①和②的  地方将print换成println就都能显示出来,另外这个东西在Eclipse好使,只是在cmd里出现了这个问题。
开始以为是flush的问题,结果试了试还是不是。

解决方案 »

  1.   

    没有测试,下面是我的一点点猜想,没有经过证实的,你可以实验下。
    ======================================
    我估计是换行符的问题,*nix程序的换行符是/n(而eclipse是起源于*nix项目的)
    而windows程序的换行符是/r/n
    当你println到缓冲的时候cmd.exe就处理为了"1/r/n2/r/n"
    然后你split后就是"1/r"和"2/r"
    而/r代表回到行首,/n代表换行,于是你在cmd.exe里面就是这样
    先输出1,然后光标回到行首(没有换行)再输出2,然后光标再回到行首,于是1被覆盖了。
    --------
    而eclipse作为*nix类型的程序,它的换行符是/n
    当你println到缓冲的时候eclipse就处理为了"1/n2/n",没有任何问题
    --------
    检验方法:改为split("/r/n"),如果cmd.exe下正常输出,而eclipse下出现数组溢出(代表它不含/r/n)或者eclipse下也正常(代表它虽然也用/r/n作为换行符,但是对单个/r进行了忽略)。
    ==========================
    当然,以上都只是我的猜测,如果检验结果说明我猜错了,也望大家探讨探讨~~~
      

  2.   

    String[] as = baoStream.toString().split("\n");
    改成
    String[] as = baoStream.toString().split("\r\n");
    就行了,不然,split之后,是1\r2\r
    \r表示回车,回到行首,把这行内容给清了。
    eclipse可以正常显示,是因为eclipse有兼容考虑,\r和\n和\r\n都表现为一个换行效果,而CMD是windows的,\r\n才是换行,\r是回车。
      

  3.   


    试了试,大神说的确实对啊。试了一炮,eclipse里/r 貌似跟/n是一样的输出效果,就是多了一个空行。thx...深深的理解了。多谢