博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~。
以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】
一、java.io
1.27 FilterReader
在 Java I/O 中,FilterReader
是用于提供字符输入流过滤功能的抽象基类,它继承自 Reader
。FilterReader
本身没有添加新的方法,但它可以作为其他字符输入流的包装器,通过添加过滤功能来修改字符输入流的行为。
FilterReader
介绍:
FilterReader
提供了一个通用的框架,可用于实现字符输入流的过滤器。过滤器是字符输入流的派生类,通过在读取字符数据之前或之后对数据进行处理来修改其行为。FilterReader
的派生类通常会覆盖其中的一些方法,以实现特定的过滤逻辑。
FilterReader
所有字段:
FilterReader
类没有公共字段。
FilterReader
构造方法:
FilterReader
的构造方法主要是通过将其他字符输入流作为参数传递来创建过滤器。以下是构造方法:
-
protected FilterReader(Reader in)
: 创建一个新的FilterReader
,给定要进行过滤的基础字符输入流。
FilterReader
方法摘要:
FilterReader
类继承了 Reader
的所有方法,但没有添加新的方法。以下是一些常用的方法:
-
int read()
: 读取单个字符的数据。 -
int read(char[] cbuf)
: 从输入流中读取一些字符,并将它们存储到字符数组cbuf
中。 -
int read(char[] cbuf, int off, int len)
: 从输入流中读取最多len
个字符的数据,并将其存储到字符数组cbuf
中,从偏移量off
开始。 -
long skip(long n)
: 跳过输入流中的n
个字符。 -
boolean ready()
: 返回是否可以从输入流中读取字符而不阻塞。 -
boolean markSupported()
: 返回此流是否支持mark()
和reset()
操作。 -
void mark(int readAheadLimit)
: 在当前位置标记输入流,并允许后续的reset()
操作在readAheadLimit
字符之前重新定位流。 -
void reset()
: 将输入流重新定位到上次调用mark()
方法时的位置。 -
void close()
: 关闭输入流。
简单使用例子:
以下是一个简单的例子,演示如何使用 FilterReader
的一个具体子类 BufferedReader
进行字符输入流的缓冲:
javaCopy code import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.Reader; public class BufferedReaderExample { public static void main(String[] args) {try (Reader fileReader = new FileReader("example.txt");Reader bufferedReader = new BufferedReader(fileReader)) { // 通过缓冲输入流读取字符数据int data;while ((data = bufferedReader.read()) != -1) {System.out.print((char) data);} } catch (IOException e) {e.printStackTrace();}} }
在这个例子中,我们使用 BufferedReader
对 FileReader
进行了包装。BufferedReader
是 FilterReader
的一个子类,它通过在内存中创建一个缓冲区来提高字符输入流的性能。通过使用过滤器,我们可以更方便地添加额外的功能,而不改变基础字符输入流的行为。
应用场景
FilterReader
主要用于实现字符输入流的过滤功能,以下是一些应用场景和相应的代码实现:
1. 缓冲输入流:
-
场景: 提高字符输入流的性能,避免每次读取都直接操作文件。
-
代码实现:
javaCopy code try (Reader fileReader = new FileReader("example.txt");Reader bufferedReader = new BufferedReader(fileReader)) { // 使用缓冲输入流读取字符数据int data;while ((data = bufferedReader.read()) != -1) {System.out.print((char) data);} } catch (IOException e) {e.printStackTrace(); }
2. 解析基本数据类型:
-
场景: 从字符输入流中读取基本数据类型的值,如
int
、float
等。 -
代码实现:
javaCopy code try (Reader fileReader = new FileReader("data.txt");Reader reader = new BufferedReader(fileReader);Reader dataReader = new DataFilterReader(reader)) { // 从数据流中读取整数int intValue = dataReader.read();System.out.println("Read integer value: " + intValue); } catch (IOException e) {e.printStackTrace(); }
3. 自定义过滤器:
-
场景: 实现自定义的字符输入流过滤器以满足特定需求。
-
代码实现:
javaCopy code class MyFilterReader extends FilterReader {// 自定义过滤器的实现... MyFilterReader(Reader in) {super(in);} } // 在代码中使用自定义的过滤器 try (Reader fileReader = new FileReader("example.txt");Reader customFilterReader = new MyFilterReader(fileReader)) { // 使用自定义过滤器读取字符数据int data;while ((data = customFilterReader.read()) != -1) {System.out.print((char) data);} } catch (IOException e) {e.printStackTrace(); }
4. 异常处理:
-
场景: 在读取字符数据时处理可能的异常。
-
代码实现:
javaCopy code try (Reader fileReader = new FileReader("example.txt")) {// 读取字符数据int data;while ((data = fileReader.read()) != -1) {// 处理数据} } catch (IOException e) {System.err.println("Error reading from the file: " + e.getMessage()); }
5. 字符流转换:
-
场景: 将字符输入流转换为其他字符编码。
-
代码实现:
javaCopy code try (Reader fileReader = new FileReader("utf8_data.txt");Reader utf16Reader = new InputStreamReader(fileReader, StandardCharsets.UTF_16)) { // 使用字符流转换器读取字符数据int data;while ((data = utf16Reader.read()) != -1) {System.out.print((char) data);} } catch (IOException e) {e.printStackTrace(); }
这些例子展示了在不同场景下使用 FilterReader
的一些常见用法。在实际应用中,具体的使用方式取决于需求和对字符输入流的定制化需求。
项目实战
在一个实际项目中,使用 FilterReader
的场景可能涉及到一些特定的需求,比如数据解析、字符编码转换、异常处理等。以下是一个简单的项目实战例子,演示如何使用 FilterReader
的子类 LineNumberReader
进行文件的逐行读取,并记录行号。
项目要求:
-
有一个文本文件
example.txt
,需要逐行读取该文件的内容,并记录每行的行号。 -
使用
LineNumberReader
进行逐行读取,并在每行的开头添加行号信息。 -
将读取后的内容输出到控制台。
项目实战代码:
javaCopy code import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.io.Reader; public class LineNumberReaderProject { public static void main(String[] args) {try (Reader fileReader = new FileReader("example.txt");Reader lineNumberReader = new LineNumberReader(fileReader)) { // 使用 LineNumberReader 逐行读取文件内容并输出带行号的结果String line;while ((line = ((LineNumberReader) lineNumberReader).readLine()) != null) {System.out.println("Line " + ((LineNumberReader) lineNumberReader).getLineNumber() + ": " + line);} } catch (IOException e) {e.printStackTrace();}} }
在这个例子中,我们使用了 LineNumberReader
对 FileReader
进行了包装。LineNumberReader
是 FilterReader
的一个子类,它可以记录当前行号,并提供了 readLine()
方法来逐行读取文本内容。通过使用过滤器,我们方便地实现了逐行读取并记录行号的功能。在真实项目中,可能还需要考虑异常处理、日志记录等方面的更多细节。