黑马程序员技术交流社区
标题:
关于readline方法
[打印本页]
作者:
史卜坤
时间:
2012-7-12 19:13
标题:
关于readline方法
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();
}
}
作者:
徐然
时间:
2012-7-12 19:42
本帖最后由 徐然 于 2012-7-12 19:45 编辑
读到else就可以知道文本文档中的\r\n并不符合if语句的判断条件
也就是说文本中的\r\n跟if语句的\r\n不是一回事了.
因为在文本文档中的\r和\n都被认为是两个字符
当windows底层在读文档的时候,当读到回车+换行(回车键)的时候,他读的结果是\r\n
但是并不是说在文档中读到\r\n的时候也认为他是回车+换行.
而是把它当做'\','r','\','n'四个字符来读的.(因为编码的过程不是把'\'当做转义字符,而是一个单独的字符)
也就是说这并不是一个可逆转的过程.
作者:
游兴钟
时间:
2012-7-12 19:49
本帖最后由 achilles 于 2012-7-12 20:29 编辑
楼上的说的对 学习了
作者:
刘煜
时间:
2012-7-12 22:40
首先你必须分清楚在文本文档中环境下的\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"代表换行;而"\"本身又是一个字符,为区别转义字符中的"\",它也有对应的转义字符"\\"代替。
作者:
张莹莹
时间:
2012-7-12 23:28
本帖最后由 张莹莹 于 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, 下载次数: 33)
下载附件
2012-7-12 23:25 上传
回车换行解释
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2