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,如何做到? 展开
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,如何做到? 展开
3个回答
展开全部
确实是回车换行的问题,在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');
这样同样可以正确输出,因为已经将缓存中的数据打印出来并清空了.补充一点,所有的打印语句只有在缓冲流清空的时候才会打印出来.如果不清空,那么是不会有打印结果的.当然,程序结尾肯定会打印出结果.
展开全部
DOS下可能无法正确显示\r转义字符。 System.out.print('\r'); 你换成 System.out.print('\n'); 结果应该一样了。输出的是打印的,要么就不输出hello world,如果输出了,是没办法删除的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
换行的问题 eclipse是正确的 至于你的另外一个问题 是在哪里输出
更多追问追答
追问
输出hello world 后,回到本行首,输出eee
追答
你是说在控制台? 还是其他地方呀
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询