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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-12 19:13  /  2084 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
public class MyReadline {//根据readline方法原理,重写readline方法
        private FileReader fr;

public MyReadline(FileReader fr){
                this.fr=fr;
        }
public String readline() throws IOException{
        StringBuffer sb=new StringBuffer();
   
    int len=0;
    while((len=fr.read())!=-1){
            if(len==('\r'))//为什么我在文本文档文字后面人为加上\r或者\n程序不会执行IF语句而是执行else语句呢?而键入一个enter换行符它又会走if语句呢?求指教
                    continue;
            if(len=='\n')
                    return sb.toString();
            else
                sb.append((char)len);
    }  
        if(sb.length()!=0)
            return sb.toString();
        return null;
}
public void mycolse()throws IOException{
        fr.close();
}
}

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 徐然 于 2012-7-12 19:45 编辑

读到else就可以知道文本文档中的\r\n并不符合if语句的判断条件
也就是说文本中的\r\n跟if语句的\r\n不是一回事了.
因为在文本文档中的\r和\n都被认为是两个字符
当windows底层在读文档的时候,当读到回车+换行(回车键)的时候,他读的结果是\r\n
但是并不是说在文档中读到\r\n的时候也认为他是回车+换行.
而是把它当做'\','r','\','n'四个字符来读的.(因为编码的过程不是把'\'当做转义字符,而是一个单独的字符)
也就是说这并不是一个可逆转的过程.

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 achilles 于 2012-7-12 20:29 编辑

楼上的说的对  学习了
回复 使用道具 举报
首先你必须分清楚在文本文档中环境下的\t\n,操作系统会认为它们是文本文档中四个字符,只代表它们本身,代码编辑器中源代码的\t\n,系统会认为它们是java语言中的转义字符,代表换行。在你的程序代码中,当你在文本文档中存有\t\n,程序代码中的FileReader的read方法读取文本文档中的数据时,会将文本文档中的\t\n识别为普通的字符同时在Unicode编码表中找到它们对应的二进制数据流,并读取到内存的字符流中,在程序中将字符流中数据赋值给len时,len将分别为"\\"、"t"、"\\"、"n",而不会等于"\t"、"\n",所以当与"\t"和"\n"比较时不会执行两个if语句;当你在文本文档中输入换行符时,程序也会在在Unicode编码表中找到换行符对应的二进制数据流,并读取到内存的字符流中,这里将字符流中数据赋值给len时,len将会是java中的转义字符"\t\n",,比较时就会执行两个if语句。
由于换行符在编写代码时没有字符代替,java中就出现转义字符,用"\t\n"代表换行;而"\"本身又是一个字符,为区别转义字符中的"\",它也有对应的转义字符"\\"代替。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 张莹莹 于 2012-7-12 23:30 编辑

1、首先,在文本编辑器中直接输入\r\n,保存后,我们使用UltraEdit用16进制的模式打开,会发现\t\n所对应的16进制为5C,72,5C,6E
2、当我们直接敲回车后保存,用16进制读取文件后会发现,保存的内容为0D,0A,而我们可以通过ASCII表查询到,0D代表\r,0A代表\n
3、在JAVA中,"\n"是转义字符,代表ASCII中的0A,而"\r"在JAVA中代表ASCII中的0D
所以,直接输入\r\n时,JAVA获取到得是5C 72 5C 6E,所以不会执行if语句
而当直接回车时,JAVA获取到得是0D和0A,所以会执行if语句

回车换行解释.png (127.72 KB, 下载次数: 34)

回车换行解释

回车换行解释

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马