Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例

1. 自定义类模拟LineNumberReader的获取行号功能案例

2. 代码实现:

(1)MyBufferedReader.java:

 1 package cn.itcast_08;
 2
 3 import java.io.IOException;
 4 import java.io.Reader;
 5
 6 /*
 7  * 用Reader模拟BufferedReader的readLine()功能
 8  *
 9  * readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符
10  */
11 public class MyBufferedReader {
12     private Reader r;
13
14     public MyBufferedReader(Reader r) {
15         this.r = r;
16     }
17
18     /*
19      * 思考:写一个方法,返回值是一个字符串。
20      */
21     public String readLine() throws IOException {
22         /*
23          * 我要返回一个字符串,我该怎么办呢? 我们必须去看看r对象能够读取什么东西呢? 两个读取方法,一次读取一个字符或者一次读取一个字符数组
24          * 那么,我们要返回一个字符串,用哪个方法比较好呢? 我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢?
25          * 根本就没有办法定义数组的长度,你定义多长都不合适。 所以,只能选择一次读取一个字符。
26          * 但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了 所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。
27          * 这个用谁比较和是呢?数组,集合,字符串缓冲区三个可供选择。
28          * 经过简单的分析,最终选择使用字符串缓冲区对象。并且使用的是StringBuilder
29          */
30         StringBuilder sb = new StringBuilder();
31
32         // 做这个读取最麻烦的是判断结束,但是在结束之前应该是一直读取,直到-1
33
34
35         /*
36         hello
37         world
38         java
39
40         104101108108111
41         119111114108100
42         1069711897
43          */
44
45         int ch = 0;
46         while ((ch = r.read()) != -1) { //104,101,108,108,111
47             if (ch == ‘\r‘) {
48                 continue;
49             }
50
51             if (ch == ‘\n‘) {
52                 return sb.toString(); //hello
53             } else {
54                 sb.append((char)ch); //hello
55             }
56         }
57
58         // 为了防止数据丢失,判断sb的长度不能大于0
59         if (sb.length() > 0) {
60             return sb.toString();
61         }
62
63         return null;
64     }
65
66     /*
67      * 先写一个关闭方法
68      */
69     public void close() throws IOException {
70         this.r.close();
71     }
72 }

(2)MyLineNumberReader2.java:

 1 package cn.itcast_09;
 2
 3 import java.io.IOException;
 4 import java.io.Reader;
 5
 6 import cn.itcast_08.MyBufferedReader;
 7
 8 public class MyLineNumberReader2 extends MyBufferedReader {
 9     private Reader r;
10
11     private int lineNumber = 0;
12
13     public MyLineNumberReader2(Reader r) {
14         super(r);
15     }
16
17     public int getLineNumber() {
18         return lineNumber;
19     }
20
21     public void setLineNumber(int lineNumber) {
22         this.lineNumber = lineNumber;
23     }
24
25     @Override
26     public String readLine() throws IOException {
27         lineNumber++;
28         return super.readLine();
29     }
30 }

(3)测试类MyLineNumberReaderTest,如下:

 1 package cn.itcast_09;
 2
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5
 6 public class MyLineNumberReaderTest {
 7     public static void main(String[] args) throws IOException {
 8         // MyLineNumberReader mlnr = new MyLineNumberReader(new FileReader(
 9         // "my.txt"));
10
11         MyLineNumberReader2 mlnr = new MyLineNumberReader2(new FileReader(
12                 "my.txt"));
13
14         // mlnr.setLineNumber(10);
15
16         // System.out.println(mlnr.getLineNumber());
17         // System.out.println(mlnr.getLineNumber());
18         // System.out.println(mlnr.getLineNumber());
19
20         String line = null;
21         while ((line = mlnr.readLine()) != null) {
22             System.out.println(mlnr.getLineNumber() + ":" + line);
23         }
24
25         mlnr.close();
26     }
27 }

运行效果,如下:

时间: 2024-10-10 20:57:43

Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例的相关文章

Java基础知识强化之集合框架笔记55:Map集合之HashMap集合(HashMap<Integer,String>)的案例

1. HashMap集合(键是Integer,值是String的案例) 2. 代码示例: 1 package cn.itcast_02; 2 3 import java.util.HashMap; 4 import java.util.Set; 5 6 /* 7 * HashMap<Integer,String> 8 * 键:Integer 9 * 值:String 10 */ 11 public class HashMapDemo2 { 12 public static void main(

Java基础知识强化之网络编程笔记22:Android网络通信之 Android常用OAuth登录(获取个人信息)

1. 获取百度个人信息(使用Gson解析): 2. 代码案例: (1)工程一览图,如下: (2)activity_main.xml: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent

Java基础知识强化之集合框架笔记57:Map集合之HashMap集合(HashMap&lt;Student,String&gt;)的案例

1. HashMap集合(HashMap<Student,String>)的案例 HashMap<Student,String>键:Student      要求:如果两个对象的成员变量值都相同,则为同一个对象.值:String HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap 中作为键的对象必须重写Object的hashCode()方法和equals()方法 2. 代码示例: (1)Student.java,如下: 1 pa

Java基础知识强化之集合框架笔记58:Map集合之LinkedHashMap类的概述

1. LinkedHashMap类的概述 LinkedHashMap:Map接口的哈希表(保证唯一性) 和 链接(保证有序性)列表实现,具有可预知的迭代顺序. 2. 代码示例: 1 package cn.itcast_03; 2 3 import java.util.LinkedHashMap; 4 import java.util.Set; 5 6 /* 7 * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序. 8 * 由哈希表保证键的唯一性 9 * 由链

Java基础知识强化之集合框架笔记06:Collection集合存储自定义对象并遍历的案例

1.练习:用集合存储5个学生对象,并把学生对象进行遍历. 分析: (1)创建学生类(2)创建集合对象(3)创建学生对象(4)把学生添加到集合(5)把集合转成数组(6)遍历数组 2. 代码示例: Student.java如下: 1 package cn.itcast_02; 2 3 public class Student { 4 // 成员变量 5 private String name; 6 private int age; 7 8 // 构造方法 9 public Student() { 1

Java基础知识强化之集合框架笔记61:Map集合之统计字符串中每个字符出现的次数的案例

1. 首先我们看看统计字符串中每个字符出现的次数的案例图解:

Java基础知识强化之集合框架笔记37:用户登录注册案例

1. 登录注册案例分析图解: 2. 用户登录案例 详细分析 和 分包实现: (1)用户登录案例详细分析(面向对象思想) 按照如下的操作,可以让我们更符合面向对象思想: • 有哪些类呢?                 用户类                 测试类       • 每个类有哪些东西呢?                 用户类: 成员变量:用户名,密码                            构造方法:无参构造                            成

Java基础知识强化之网络编程笔记13:TCP之TCP协议上传图片并给出反馈

1. TCP协议上传图片并给出反馈: (1)客户端: 1 package cn.itcast_13; 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileInputStream; 6 import java.io.IOException; 7 import java.io.InputStream; 8 import java.net.Socket;

Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)

1. 多个客户端上传到一个服务器的思考 通过while循环可以改进一个服务器接收多个客户端. 但是这个是有问题的.如果是这种情况,假设我还有张三,李四,王五这三个人分别执行客户端  张三:好好学习.avi(100M) 256k  李四:天天向上.mp3(3M)   1M  王五:ILoveJava.txt(1k) 100M 这要等张三传完了,再去传李四…… 2. 使用多线程改进: (1)线程类UserThread: 1 package cn.itcast_15; 2 3 import java.