跳转至

Java中BufferedReader示例详解

简介

在Java编程中,BufferedReader 是一个非常实用的类,它位于 java.io 包中。BufferedReader 提供了高效的字符输入流读取功能,通过缓冲区减少了与底层数据源(如文件、网络连接等)的交互次数,从而提高了读取性能。本文将详细介绍 BufferedReader 的基础概念、使用方法、常见实践以及最佳实践,帮助读者深入理解并高效使用它。

目录

  1. 基础概念
  2. 使用方法
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

BufferedReader 是一个字符缓冲输入流类,它继承自 Reader 类。其主要作用是从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。

BufferedReader 内部维护了一个缓冲区,当调用 read()readLine() 方法时,它首先尝试从缓冲区中读取数据。如果缓冲区为空,它会从底层输入流中读取一大块数据填充到缓冲区,然后再从缓冲区中取出数据返回给调用者。这样可以减少与底层输入流的交互次数,提高读取效率。

使用方法

1. 创建 BufferedReader 对象

通常需要先创建一个底层的字符输入流,如 FileReaderInputStreamReader,然后将其作为参数传递给 BufferedReader 的构造函数。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        try {
            // 创建 FileReader 对象
            FileReader fileReader = new FileReader("example.txt");
            // 创建 BufferedReader 对象
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            // 使用完后关闭资源
            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 读取数据

BufferedReader 提供了两个常用的读取方法: - read():读取单个字符,返回字符的 Unicode 码值,如果到达流的末尾则返回 -1。 - readLine():读取一行文本,返回包含该行内容的字符串,如果到达流的末尾则返回 null

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderReadExample {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("example.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            // 使用 read() 方法读取单个字符
            int c;
            while ((c = bufferedReader.read()) != -1) {
                System.out.print((char) c);
            }

            // 或者使用 readLine() 方法读取一行文本
            /*
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
            */

            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

常见实践

1. 从控制台读取用户输入

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BufferedReaderConsoleInputExample {
    public static void main(String[] args) {
        try {
            // 创建 InputStreamReader 对象,将 System.in 转换为字符流
            InputStreamReader inputStreamReader = new InputStreamReader(System.in);
            // 创建 BufferedReader 对象
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            System.out.println("请输入一行文本:");
            String line = bufferedReader.readLine();
            System.out.println("你输入的文本是:" + line);

            bufferedReader.close();
            inputStreamReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 逐行读取文件内容并统计行数

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderCountLinesExample {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("example.txt");
            BufferedReader bufferedReader = new BufferedReader(fileReader);

            int lineCount = 0;
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                lineCount++;
            }

            System.out.println("文件的行数为:" + lineCount);

            bufferedReader.close();
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

最佳实践

1. 使用 try-with-resources 语句

try-with-resources 语句可以自动关闭实现了 AutoCloseable 接口的资源,避免手动关闭资源时可能出现的错误。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderTryWithResourcesExample {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt");
             BufferedReader bufferedReader = new BufferedReader(fileReader)) {

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 合理设置缓冲区大小

BufferedReader 的构造函数允许指定缓冲区的大小。一般情况下,使用默认的缓冲区大小即可,但在某些情况下,根据实际需求调整缓冲区大小可以进一步提高性能。

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderCustomBufferSizeExample {
    public static void main(String[] args) {
        try (FileReader fileReader = new FileReader("example.txt");
             BufferedReader bufferedReader = new BufferedReader(fileReader, 8192)) {

            String line;
            while ((line = bufferedReader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

小结

BufferedReader 是 Java 中一个非常实用的字符缓冲输入流类,它通过缓冲区提高了字符读取的效率。本文介绍了 BufferedReader 的基础概念、使用方法、常见实践以及最佳实践。在实际开发中,我们可以根据具体需求选择合适的读取方法,并结合 try-with-resources 语句和合理设置缓冲区大小来提高代码的健壮性和性能。

参考资料

  • 《Effective Java》
  • 《Java核心技术》