java问题。为什么这个程序在dos和eclipse下运行结果不同

publicclassDemo{publicstaticvoidmain(String[]args){Strings1="helloworld";System.out.p... public class Demo{
public static void main(String[] args){
String s1 = "hello world";
System.out.print(s1);
String s2 = "eee";
System.out.print('\r');
System.out.println(s2);
}

}
在dos下 ,运行结果是 eeelo world
在eclipse中的运行结果是 :
hello world
eee
求解释
另外 如果我想把已经输出的hello world全部删掉,然后写eee,如何做到?
展开
 我来答
chao1575639478
2014-05-28 · TA获得超过1391个赞
知道小有建树答主
回答量:353
采纳率:0%
帮助的人:222万
展开全部

确实是回车换行的问题,在cmd中,cmd把文件中的'\r'只当做回车并不换行,而System.out是一个缓冲流,流中的信息存储为“hello world”,随后直接输出回车符,你可以看看System类中的out对象可以看到,关于out的方法print(char c)方法的实现方式为:

public void print(char c) {
        write(String.valueOf(c));
    }
 private void write(String s) {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.write(s);
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush && (s.indexOf('\n') >= 0))
                    out.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }

而你打印的'\r'中并没有换行符,所以程序不会执行out.flush();换句话说就不会清空缓存,那么当打印回车符的时候,光标就转到了缓冲流的最前面,并且后面输出eee将hello中的hel覆盖,最后你使用println();输出,这时再看源代码

 public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

通过输出x后,然后创建新的一行,而下面看一下newLine()函数做了什么工作

 private void newLine() {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.newLine();
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush)
                    out.flush();
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }

newLine中自动将缓存清空,所以在控制台会打印eeelo world,在eclipse中这个ide会自动将'\r'后面加上'\n'也就不存在在cmd中出现的情况了,所以能够正确打印。

同样,你可以照着上面的思路将原来程序中的打印回车语句换成

System.out.println('\r');

这样同样可以正确输出,因为已经将缓存中的数据打印出来并清空了.补充一点,所有的打印语句只有在缓冲流清空的时候才会打印出来.如果不清空,那么是不会有打印结果的.当然,程序结尾肯定会打印出结果.

happy来去自如
2014-05-28 · 超过23用户采纳过TA的回答
知道答主
回答量:90
采纳率:0%
帮助的人:53.3万
展开全部
DOS下可能无法正确显示\r转义字符。 System.out.print('\r'); 你换成 System.out.print('\n'); 结果应该一样了。输出的是打印的,要么就不输出hello world,如果输出了,是没办法删除的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不能超过7字呀
2014-05-28 · 超过10用户采纳过TA的回答
知道答主
回答量:77
采纳率:0%
帮助的人:33.1万
展开全部
换行的问题 eclipse是正确的 至于你的另外一个问题 是在哪里输出
更多追问追答
追问
输出hello world 后,回到本行首,输出eee
追答
你是说在控制台? 还是其他地方呀
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式