今天看了毕老师的MyBufferedReader视频教程, 看完了自己写了一遍, 感受了一下; 视频中毕老师是把结果打印在控制台了, 我稍微修改了一下, 做成了复制文件;
代码中加了很多注释, 但是页面中的注释没有标识特殊颜色, 很不方便阅读, 浪费我一片苦心.
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MyBufferedReaderDemo {
/** 通过自己写的MyBufferedReader来复制文件
* @param args
* @author 啊悦
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MyBufferedReader mbr = null; //定义一个MyBufferedReader, 并初始化;
//实例化MyBufferedReader
try {
mbr = new MyBufferedReader(new FileReader("D:\\123.txt")); //"D:\\123.txt"是要被复制的原文件的路径, 因为是windows环境, 所以路径是双反斜杠
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//定义一个FileWriter
FileWriter fw = null;
//实例化FileWriter
try {
fw = new FileWriter("D:\\123_copy.txt"); //"D:\\123.txt"是要复制的目标文件的路径, 因为是windows环境, 所以路径是双反斜杠
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//把MyBufferedReader读取到的数据通过fw写入到文件
String s = null;
try {
while((s=mbr.MyReadLine())!=null){
fw.write(s);
fw.write("\r\n"); //手动输入的换行, 只在windows下有效; 并且这句还有点问题: 如果被复制的原文件不是以换行结尾的,
//那么目标文件会多出一个换行. 如果原文件是以换行结尾的, 则不会多出一个换行.
// System.out.println(s); //调试语句, 打印读到到的每一行. 注意,打印语句加了换行.
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//无论是否写入成功, 均要关闭读取流和写入流
finally{
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mbr.MyClose();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class MyBufferedReader{
private FileReader fr;
//构造方法, 要求传递一个FileReader
MyBufferedReader(FileReader fr){
this.fr = fr;
}
//自定义MyReadLine方法, 尽情的抛异常吧, 谁调用谁处理;
String MyReadLine() throws IOException{
StringBuilder sb = new StringBuilder();
int len = 0;
//单个字符读取传递进来的FileReader
while((len=fr.read())!=-1){
//如果读到\r则直接进入下一次循环
if(len=='\r'){
continue;
}
//如果读到\n表示已经读完了一行, 那么就返回这一行:sb.toString(); 否则就把读到的字符放到sb;
//如果文件最后一行没有换行, 那么会漏掉最后一行;
if(len=='\n'){
return sb.toString();
}
else{
sb.append((char)len);
}
}
//处理"如果文件最后一行没有换行, 那么会漏掉最后一行;"这个情况, 如果sb里仍然存在字符, 那么再返回一次;
if(sb.length()!=0){
return sb.toString();
}
return null;
}
void MyClose() throws IOException{
fr.close();
}
}