黑马程序员技术交流社区

标题: 模拟readLine方法 [打印本页]

作者: fanshuai    时间: 2015-2-20 01:03
标题: 模拟readLine方法
本帖最后由 fanshuai 于 2015-3-30 21:45 编辑



import java.io.IOException;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.Writer;
import java.io.Reader;
public class Test{

public static void main(String... args) throws IOException{
        //将"sfhwi\ni\rfsf\r\nuhk"写入硬盘文件
        Writer w=new FileWriter("C:\\1.Java");
        w.write("sfhwi\ni\rfsf\r\nuhk");
        w.close();
        //调用自己写的程序将"sfhwi\ni\rfsf\r\nuhk"写入另一个硬盘文件
        
Reader r = new FileReader("C:\\1.Java");
BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\2.Java"));
MyBufferedReader br = new MyBufferedReader(r);

for(String line =null;(line=br.myReadLine())!=null;){

bw.write(line);
bw.newLine();
bw.flush();



}
br.myClose();
bw.close();
}

}

class MyBufferedReader{

private Reader r;

MyBufferedReader(Reader r){

this.r=r;

}

public String myReadLine() throws IOException{

/*

定义一个临时容器,原BufferedReader封装的是字符数组


为了方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串


*/

StringBuilder sb = new StringBuilder ();

int len = 0;

while((len = r.read())!=-1){
if(len=='\r')

continue;

if(len=='\n')

return sb.toString();

else

sb.append((char)len);

}

//防止最后一行没有换行的情况


if(sb.length()!=0)

return sb.toString();

else

return null;

}

public void myClose() throws IOException{

r.close();

}

}



作者: fantacyleo    时间: 2015-2-20 02:01
视频的写法没有多大问题。单独一个'\n'可以作为换行,在*nix操作系统中就是这样,所以视频中的写法更具可移植性。单独'\r'被吃掉的情况理论上确实存在,不过实际中应该不会出现。因为'\r'表示回到行首,如果后面不接'\n',那么原先的行首字符就会被覆盖。既然要覆盖,那之前的字符岂不是多此一举,几乎不会有人做这样自相矛盾的事吧?
作者: fanshuai    时间: 2015-2-20 10:44
本帖最后由 fanshuai 于 2015-3-30 21:45 编辑
fantacyleo 发表于 2015-2-20 02:01
视频的写法没有多大问题。单独一个'\n'可以作为换行,在*nix操作系统中就是这样,所以视频中的写法更具可移 ...

嗯............





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2