Java I/0 求解!!!

wzq465551327 2012-01-14 03:16:43

import java.io.*;

public class In {
public static void main(String[] args)
{
char[] input;
int count=0;
int counter=0;
input=new char[20];

try {
while(count<20&&(input[count++]=(char)System.in.read())!='\n') {
System.out.write(input[count-1]);
System.out.write('#');
counter++;
}
}
catch (IOException e) {
e.printStackTrace();
}

System.out.println("Counter="+counter);
String output=new String(input);
System.out.println(output);
}
}

程序的意思很明白,一看就懂。但是运行始终不是想象那样。
比如:(前面数字为行号)
输入:1.hello

输出:1.hello //此处为cmd回显
2.#Counter=6 //为什么while的第一句没有输出,输出到下面去了。。还有就是counter为什么等于6
3.hello //此处应该是while循环的输出吧,但是为什么到最后来了?
4.\n //此处应该是最后一句,输出output。但是为什么成了空白符了呢?
5.\n //此处应该是cmd每次执行都会有的一个换行操作吧。。
理想中的输出应该是:
1.hello
2.h#e#l#l#o#Counter=5
3.hello
4.\n


...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzq465551327 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ldh911 的回复:]

研究了下,情况比较复杂,似乎是命令行对回车的解析问题。

也就是说,最后一个字符(\n)你write出来之后,命令行执行了回车,但是没有执行换行,结果就把之前的数据覆盖掉了;因为在同一行输出的。

具体情况,你可以这么测试:
把System.out.write( '# ');改为:
System.out.print("####");
这样你就可以看到没有被覆盖的后半段。

另一……
[/Quote]

我又看了一下。
事实证明,回车被解释成的是: '\r\n'
所以counter=6;
'\r'表示的就是回到此行首位。所以结果是这样。
wzq465551327 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wangzhilong521java 的回复:]

你想在一个循环中搞定是不可能的你想第一行输出‘1.hello’,在你的代码中看不出来,能看出你第一次想输出的是‘2.h#e#l#l#o#Counter=5 ’你在打印‘2.h#e#l#l#o#Counter=5 ’也不加限制,这个输出估计也输出的乱七八糟吧!你应该先将你输入的字符串全都读上来,再做处理!
[/Quote]

我的目的就是想打印那个东东,因为这是调试啊~就这样才可以反应问题。你看看你楼上的解释吧~
wzq465551327 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ldh911 的回复:]

研究了下,情况比较复杂,似乎是命令行对回车的解析问题。

也就是说,最后一个字符(\n)你write出来之后,命令行执行了回车,但是没有执行换行,结果就把之前的数据覆盖掉了;因为在同一行输出的。

具体情况,你可以这么测试:
把System.out.write( '# ');改为:
System.out.print("####");
这样你就可以看到没有被覆盖的后半段。

另一……
[/Quote]

看来应该是这样了!
灰常感谢!!!
wangzhilong521java 2012-01-14
  • 打赏
  • 举报
回复
你想在一个循环中搞定是不可能的你想第一行输出‘1.hello’,在你的代码中看不出来,能看出你第一次想输出的是‘2.h#e#l#l#o#Counter=5 ’你在打印‘2.h#e#l#l#o#Counter=5 ’也不加限制,这个输出估计也输出的乱七八糟吧!你应该先将你输入的字符串全都读上来,再做处理!


MiceRice 2012-01-14
  • 打赏
  • 举报
回复
研究了下,情况比较复杂,似乎是命令行对回车的解析问题。

也就是说,最后一个字符(\n)你write出来之后,命令行执行了回车,但是没有执行换行,结果就把之前的数据覆盖掉了;因为在同一行输出的。

具体情况,你可以这么测试:
把System.out.write( '# ');改为:
System.out.print("####");
这样你就可以看到没有被覆盖的后半段。

另一种方式测试是:
你在循环体外,写一行System.out.println();
wzq465551327 2012-01-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ldh911 的回复:]

你的程序,在我这里运行是OK的,除了你贴代码的时候 '\n' 和 '#' 后面多都了个空格。

输出:
HELLO // 这行是CMD回显
H#E#L#L#O# // 最后会换行是因为你输入的时候也是以回车结束的
#Counter= 6 // 换行符也算一个字符的,所以是6个
HELLO
// 其实这里还有很多char 0
[/Quote]

你是不是在控制台里面运行的啊?
之前也有人在IDE里面可以,但是在控制台里面就不行了。
还有就是Counter的问题。
进入while的条件就包括 字符不能是'\n'
所以,当读到'\n'的时候,是不会进入while块的啊。
所以就不会执行第六次Counter++啊。
MiceRice 2012-01-14
  • 打赏
  • 举报
回复
你的程序,在我这里运行是OK的,除了你贴代码的时候 '\n' 和 '#' 后面多都了个空格。

输出:
HELLO // 这行是CMD回显
H#E#L#L#O# // 最后会换行是因为你输入的时候也是以回车结束的
#Counter= 6 // 换行符也算一个字符的,所以是6个
HELLO
// 其实这里还有很多char 0

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧