黑马程序员技术交流社区
标题:
IO流的换行问题
[打印本页]
作者:
何超
时间:
2013-11-26 22:29
标题:
IO流的换行问题
本帖最后由 何超 于 2013-11-26 23:40 编辑
普通的读取
复制代码
缓冲区方式
复制代码
为什么第一个可以自动换行 而第二个不行?
作者:
何超
时间:
2013-11-26 22:30
第一个的代码
import java.io.*;
class M
{
public static void main(String[] args) throws IOException
{
FileReader fr=new FileReader("A.java");
FileWriter fw=new FileWriter("Dream.txt");
int num=0;
while((num=fr.read())!=-1)
{
fw.write((char)num);
fw.flush();
}
}
}
作者:
何超
时间:
2013-11-26 22:31
第二个的代码
import java.io.*;
class M
{
public static void main(String[] args) throws IOException
{
BufferedWriter bw=new BufferedWriter(new FileWriter("Dream.txt"));
BufferedReader br=new BufferedReader(new FileReader("A.java"));
String str=null;
while((str=br.readLine())!=null)
{
bw.write(str);
}
}
}
作者:
何超
时间:
2013-11-26 22:31
不知道是论坛搬家导致的问题还是我自己电脑问题····怎么总是不能发帖 发帖就卡死人 回复也卡···
作者:
freehiker
时间:
2013-11-26 22:37
因为第二个中的readLine是读取\r\n前的数据,没有包含回车符和换行符,若想让其换行,你可以在while里面加入bw.newLine();
作者:
Jim-剣◆﹏
时间:
2013-11-26 22:50
class MyBufferedReader
{
private FileReader fr = null;
MyBufferedReader(FileReader fr)
{
this.fr = fr;
}
public String myReaderLine()
{
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=fr.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
}
public void close()
{
fr.close();
}
}
复制代码
给你看看BufferedReader的readLine()的方法是怎么实现的,你就懂了
内部还是用的是普通的read()
正如楼上所说
readLine()的内部实现是read(),read()每一个字符都读到,并存入一个字符串缓冲容器StringBuilder中,包括换行符\r\n,但是呢,在readLine()的内部,会判断读到的字符是否是\r或\n(两者必须连着出现)
如果是,就舍弃并返回读到的StringBuilder
FileReader的read()方法本身不会区分换行符\r\n,所以,读到了换行符\r\n,也就解析成换行
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2