Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例
2015-10-12 10:16
726 查看
1. 自定义类模拟LineNumberReader的获取行号功能案例
2. 代码实现:
(1)MyBufferedReader.java:
(2)MyLineNumberReader2.java:
(3)测试类MyLineNumberReaderTest,如下:
运行效果,如下:
2. 代码实现:
(1)MyBufferedReader.java:
package cn.itcast_08; import java.io.IOException; import java.io.Reader; /* * 用Reader模拟BufferedReader的readLine()功能 * * readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 */ public class MyBufferedReader { private Reader r; public MyBufferedReader(Reader r) { this.r = r; } /* * 思考:写一个方法,返回值是一个字符串。 */ public String readLine() throws IOException { /* * 我要返回一个字符串,我该怎么办呢? 我们必须去看看r对象能够读取什么东西呢? 两个读取方法,一次读取一个字符或者一次读取一个字符数组 * 那么,我们要返回一个字符串,用哪个方法比较好呢? 我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢? * 根本就没有办法定义数组的长度,你定义多长都不合适。 所以,只能选择一次读取一个字符。 * 但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了 所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。 * 这个用谁比较和是呢?数组,集合,字符串缓冲区三个可供选择。 * 经过简单的分析,最终选择使用字符串缓冲区对象。并且使用的是StringBuilder */ StringBuilder sb = new StringBuilder(); // 做这个读取最麻烦的是判断结束,但是在结束之前应该是一直读取,直到-1 /* hello world java 104101108108111 119111114108100 1069711897 */ int ch = 0; while ((ch = r.read()) != -1) { //104,101,108,108,111 if (ch == '\r') { continue; } if (ch == '\n') { return sb.toString(); //hello } else { sb.append((char)ch); //hello } } // 为了防止数据丢失,判断sb的长度不能大于0 if (sb.length() > 0) { return sb.toString(); } return null; } /* * 先写一个关闭方法 */ public void close() throws IOException { this.r.close(); } }
(2)MyLineNumberReader2.java:
package cn.itcast_09; import java.io.IOException; import java.io.Reader; import cn.itcast_08.MyBufferedReader; public class MyLineNumberReader2 extends MyBufferedReader { private Reader r; private int lineNumber = 0; public MyLineNumberReader2(Reader r) { super(r); } public int getLineNumber() { return lineNumber; } public void setLineNumber(int lineNumber) { this.lineNumber = lineNumber; } @Override public String readLine() throws IOException { lineNumber++; return super.readLine(); } }
(3)测试类MyLineNumberReaderTest,如下:
package cn.itcast_09; import java.io.FileReader; import java.io.IOException; public class MyLineNumberReaderTest { public static void main(String[] args) throws IOException { // MyLineNumberReader mlnr = new MyLineNumberReader(new FileReader( // "my.txt")); MyLineNumberReader2 mlnr = new MyLineNumberReader2(new FileReader( "my.txt")); // mlnr.setLineNumber(10); // System.out.println(mlnr.getLineNumber()); // System.out.println(mlnr.getLineNumber()); // System.out.println(mlnr.getLineNumber()); String line = null; while ((line = mlnr.readLine()) != null) { System.out.println(mlnr.getLineNumber() + ":" + line); } mlnr.close(); } }
运行效果,如下:
相关文章推荐
- Java中的小问题
- 再谈Java双括弧技巧:不规范的语法?
- eclipse下安装axis2工具插件
- java常用工具类(不定时更新)
- java web登录页面上记住密码
- Eclipse快捷键 10个最有用的快捷键
- struts2,hibernate4,spring3配置时问题汇总及解决办法
- java String转bigdecimal 精确两位小数点然后对转的数进行算法计算。
- Java基础知识强化之IO流笔记54:IO流练习之 LineNumberReader的特有的功能使用
- MyEclipse中配置Struts2配置文件XML自动提示
- spring4+mybatis框架构建
- Java电话号码和手机号码正则验证
- java 泛型的声明
- Eclipse中dynamic web project与web project 的区别
- myeclipse破解代码
- Java 中The literal 078 of type int is out of range问题
- java.sql.date与java.util.date,认识java.sql包(2015年10月9日)
- Java多态性详细举例说明(很经典例子)
- admin嵌套在spring mvc项目里,菜单栏点击新连接每次都会重置
- java.sql.ResultSet技术(从数据库查询出的结果集里取列值)