A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dev 中级黑马   /  2012-7-12 23:49  /  1968 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁游龙 于 2012-7-14 07:05 编辑

看了很多书都说在java的转义字符中,"\r"代表回车,"\n"代表换行
这里有个很困惑的地方,不知道这两者有什么区别?例如我们在window
系统中建立一个txt文件,在文件里写内容时,我们按下回车键就换行了
,而java中的又把换行和回车分开来,这里不是明白。看看毕老师在
19天-15-IO流(读取键盘录入)中的程序:
  1. import java.io.*;
  2. public class ReadIn
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                 InputStream is = System.in;
  7.                 StringBuilder sb = new StringBuilder();
  8.                
  9.                 while(true){
  10.                         int by = is.read();
  11.                         
  12.                         if(by=='\r'){    //回车
  13.                                 continue;
  14.                         }

  15.                         if(by=='\n'){    //换行
  16.                                 String s = sb.toString();
  17.                                 if("over".equals(s)){
  18.                                         break;
  19.                                 }
  20.                                 System.out.println(s.toUpperCase());
  21.                                 sb.delete(0,sb.length());
  22.                         }else{
  23.                                 sb.append((char)by);
  24.                         }                        
  25.                 }
  26.                
  27.         }
  28. }
复制代码
请大家帮忙解释下,这个程序的流程和原因。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

5 个回复

倒序浏览
本帖最后由 张莹莹 于 2012-7-13 00:24 编辑

功能解释:
    ASCII:0D \r 回车 回到行首
    ASCII:0A \n 换行 换到当前下一行
至于为什么会出现这种状况,是因为历史的原因
    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历。
    后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“\n”;
Windows系统里面,每行结尾是“<换行><回车>”,即“\n\r”;
Mac系统里,每行结尾是“<回车>”。
一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
基于以上原因,JAVA为了保证跨平台兼容性,所以定义了回车和换行两种控制字符。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
学习了 楼主好细心啊 这都发现了 看来我还是要努力了 总结到了以后看代码要都细心啊····
回复 使用道具 举报
李志群 发表于 2012-7-13 01:32
学习了 楼主好细心啊 这都发现了 看来我还是要努力了 总结到了以后看代码要都细心啊···· ...

哈哈。一起努力。加油!
回复 使用道具 举报
张莹莹 发表于 2012-7-13 00:15
功能解释:
    ASCII:0D \r 回车 回到行首
    ASCII:0A \n 换行 换到当前下一行

你解释得很详细,综合楼上的程序分析和你的历史来历,现在终于明白了。谢谢!
回复 使用道具 举报
王艺霖 发表于 2012-7-13 00:10
if(by=='\r'){    //回车   windows里换行是\r\n   linux里默认的是\n    只不过不会在控制台上显示  如 ...

程序的流程,你分析得很到位,谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马