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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 够了没有 中级黑马   /  2013-11-19 16:50  /  1699 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 够了没有 于 2013-11-20 15:53 编辑

根据BufferedReader中方法readLine的描述:“通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行。“
为什么我通过代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

class IO流 {
        public static void main(String[] args) throws IOException{
                FileReader fr = new FileReader("Demo.txt");
                BufferedReader bufr = new BufferedReader(fr);
                FileWriter fw = new FileWriter("DemoCopy.txt");
                BufferedWriter bufw = new BufferedWriter(fw);
                String str = null;
                while((str = bufr.readLine())!=null){
                        bufw.write(str);
                        bufw.newLine();
                        bufw.flush();
                }
                bufr.close();
                bufw.close();
        }
}
复制内容为:
abcde1

abc\r\nde2
abcde3
abcde4
的文本时,复制得到的文本是这样的:
abcde1

abc\r\nde2
abcde3
abcde4
而不是这样的:
abcde1

abc
de2
abcde3
abcde4
----------------------------------------------------------------------------------------------------
原文本中不是有\r\n吗?为什么readLine读到了不换行?而且通过自定义的myReaderLine方法也是这样。为什么?

2 个回复

倒序浏览
\r和\n是转义字符,如果你要向控制台输出\n,那么你应该写成System.out.println("\\n");
因为\是一个转义字符,\n会被转义成换行,如果你希望\作为普通字符出现,那么就应该对其转义以\\代替。
Scanner input = new Scanner(System.in);
System.out.println("输入的是:"+input.next());
运行结果截图

在这里\n其实是两个字符'\'和'n',是普通字符,而转义字符'\n'是一个字符
从Java程序与文本文件也是这样的,文本文件中的\n其实是两个,在控制台输出当然是两个字符\n,而向文本文件中写入字符串"\r\n",注意这里是两个字符'\r'和'\n',在windows系统中字符'\r'和'\n'会被解释成换行


QQ截图20131119173404.png (755 Bytes, 下载次数: 9)

QQ截图20131119173404.png
回复 使用道具 举报

我是这么理解的,读文本文件时,每行结尾都有回车,windows中回车是'\r''\n'两个字符,读到'\r’时就无视他,读到'\n'时把存在StringBuffer里的字符串返回,而'\r''\n'都没在字符串中。
你建个txt文件,自己用realLine()读一下,就知道,所有文字挤在一行
所以BufferedWriter 中会有一个newLine()方法,就是用来换行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马