(每日持续更新)jdk api之BufferedWriter基础、应用、实战

2024-01-03 10:27:48

? ? ? ? 博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿,每天都会整理到12点,为了就是能让大家能够真正了解该技术栈的真正原理,最终从程序员成为一名真正的架构师,写的不一定是全站做好的,但是是全站最用心的~~~~~。

以后我会推出一些列的文章,每天都会更新,每天进步一点点,发布顺序【java的api基础、应用、实战】->【java开源技术栈及源码分析】->【java开源技术栈整合】->【java低代码开发平台的建设】

1.9 BufferedWriter

BufferedWriter 是 Java 中 Writer 的缓冲流实现,用于提高写入字符数据的性能。它提供了一些额外的属性和方法,以增强对字符流的操作。

以下是 BufferedWriter 的一些常用属性和方法:

构造函数:
  1. BufferedWriter(Writer out)

    • 使用默认缓冲区大小创建 BufferedWriter 对象。

  2. BufferedWriter(Writer out, int size)

    • 使用指定缓冲区大小创建 BufferedWriter 对象。

方法:
  1. void close()

    • 关闭字符输出流及其底层流。

  2. void flush()

    • 刷新缓冲区,将缓冲区中的数据一次性写入底层输出流。

  3. void write(char[] cbuf, int off, int len)

    • 将字符数组中从偏移量 off 开始的 len 个字符写入缓冲区。

  4. void write(int c)

    • 将指定的字符写入缓冲区。

  5. void write(String str, int off, int len)

    • 将字符串中从偏移量 off 开始的 len 个字符写入缓冲区。

使用示例:
javaCopy code
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
?
public class BufferedWriterExample {
?
 ?  public static void main(String[] args) {
 ? ? ?  String filePath = "output.txt";
?
 ? ? ?  try (FileWriter fileWriter = new FileWriter(filePath);
 ? ? ? ? ? ? BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) {
?
 ? ? ? ? ?  // 写入字符串到缓冲区
 ? ? ? ? ?  bufferedWriter.write("Hello, BufferedWriter!");
?
 ? ? ? ? ?  // 写入换行符
 ? ? ? ? ?  bufferedWriter.newLine();
?
 ? ? ? ? ?  // 写入字符数组
 ? ? ? ? ?  char[] charArray = {'A', 'B', 'C'};
 ? ? ? ? ?  bufferedWriter.write(charArray, 0, charArray.length);
?
 ? ? ? ? ?  // 刷新缓冲区,将数据写入底层输出流
 ? ? ? ? ?  bufferedWriter.flush();
?
 ? ? ?  } catch (IOException e) {
 ? ? ? ? ?  e.printStackTrace();
 ? ? ?  }
 ?  }
}

在这个例子中,BufferedWriter 被用来包装一个 FileWriter,以提供缓冲功能。通过 write 方法写入字符串、字符数组,并通过 newLine 方法写入换行符。最后通过 flush 方法刷新缓冲区,将数据一次性写入文件。这种方式能够提高写入性能,减少与底层输出流的直接交互次数。

应用场景:

BufferedWriter 主要用于提高写入字符数据的性能,特别是在写入大量数据时。以下是一些适合使用 BufferedWriter 的应用场景:

  1. 文件写入:

    • 当向文本文件中写入数据时,使用 BufferedWriter 可以减少对磁盘的频繁写入操作,提高写入效率。

    javaCopy code
    try (FileWriter fileWriter = new FileWriter("example.txt");
     ? ? BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) {
     ?  // 使用 bufferedWriter 写入文本数据
     ?  bufferedWriter.write("Hello, BufferedWriter!");
     ?  bufferedWriter.newLine();
     ?  bufferedWriter.write("This is a new line.");
     ?  bufferedWriter.flush();
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
  2. 网络数据传输:

    • 在向网络连接中写入字符数据时,使用 BufferedWriter 可以减少网络 I/O 操作,提高写入性能。

    javaCopy code
    try (Socket socket = new Socket("example.com", 80);
     ? ? OutputStream socketOutputStream = socket.getOutputStream();
     ? ? OutputStreamWriter writer = new OutputStreamWriter(socketOutputStream);
     ? ? BufferedWriter bufferedWriter = new BufferedWriter(writer)) {
     ?  // 使用 bufferedWriter 写入网络数据
     ?  bufferedWriter.write("HTTP/1.1 200 OK");
     ?  bufferedWriter.newLine();
     ?  bufferedWriter.write("Content-Type: text/html");
     ?  bufferedWriter.newLine();
     ?  bufferedWriter.flush();
    } catch (IOException e) {
     ?  e.printStackTrace();
    }
  3. 日志记录:

    • 在记录大量日志数据时,使用 BufferedWriter 可以将日志信息缓存起来,并一次性写入日志文件,提高写入性能。

    javaCopy code
    try (FileWriter fileWriter = new FileWriter("application.log", true);
     ? ? BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) {
     ?  // 使用 bufferedWriter 写入日志信息
     ?  bufferedWriter.write("[" + getCurrentTimestamp() + "] Error: Something went wrong.");
     ?  bufferedWriter.newLine();
     ?  bufferedWriter.flush();
    } catch (IOException e) {
     ?  e.printStackTrace();
    }

总体而言,当需要频繁写入字符数据时,尤其是写入大量数据时,使用 BufferedWriter 可以减少 I/O 操作的次数,提高写入性能。在实际应用中,可以根据具体的场景和性能需求选择是否使用缓冲流。

实战例子

在一个实际项目中,你可能会使用 BufferedWriter 来将一些结构化的数据写入到文本文件中。下面是一个简化的例子,模拟一个学生信息管理系统,将学生信息写入到文本文件中。

学生实体类:

javaCopy code
import java.io.Serializable;
?
public class Student implements Serializable {
 ?  private static final long serialVersionUID = 1L;
?
 ?  private String name;
 ?  private int age;
 ?  private double score;
?
 ?  public Student(String name, int age, double score) {
 ? ? ?  this.name = name;
 ? ? ?  this.age = age;
 ? ? ?  this.score = score;
 ?  }
?
 ?  @Override
 ?  public String toString() {
 ? ? ?  return "Student{" +
 ? ? ? ? ? ? ?  "name='" + name + '\'' +
 ? ? ? ? ? ? ?  ", age=" + age +
 ? ? ? ? ? ? ?  ", score=" + score +
 ? ? ? ? ? ? ?  '}';
 ?  }
?
 ?  // 省略 getter 和 setter 方法
}

学生管理系统:

javaCopy code
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
?
public class StudentManagementSystem {
?
 ?  private static final String FILE_PATH = "students.txt";
?
 ?  public static void main(String[] args) {
 ? ? ?  List<Student> students = new ArrayList<>();
 ? ? ?  students.add(new Student("Alice", 20, 90.5));
 ? ? ?  students.add(new Student("Bob", 22, 85.0));
 ? ? ?  students.add(new Student("Charlie", 21, 92.3));
?
 ? ? ?  // 写入学生信息到文件
 ? ? ?  saveStudentsToFile(students);
?
 ? ? ?  System.out.println("Students saved to file successfully.");
 ?  }
?
 ?  private static void saveStudentsToFile(List<Student> students) {
 ? ? ?  try (FileWriter fileWriter = new FileWriter(FILE_PATH);
 ? ? ? ? ? ? BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) {
?
 ? ? ? ? ?  for (Student student : students) {
 ? ? ? ? ? ? ?  // 将学生信息格式化为字符串,并写入文件
 ? ? ? ? ? ? ?  String studentInfo = String.format("%s,%d,%.2f", student.getName(), student.getAge(), student.getScore());
 ? ? ? ? ? ? ?  bufferedWriter.write(studentInfo);
 ? ? ? ? ? ? ?  bufferedWriter.newLine();
 ? ? ? ? ?  }
?
 ? ? ? ? ?  // 刷新缓冲区,将数据写入底层输出流
 ? ? ? ? ?  bufferedWriter.flush();
?
 ? ? ?  } catch (IOException e) {
 ? ? ? ? ?  e.printStackTrace();
 ? ? ?  }
 ?  }
}

在这个例子中,StudentManagementSystem 类使用了 BufferedWriter 将学生信息写入到文本文件中。每个学生的信息被格式化为一个字符串,并通过 write 方法写入文件。newLine 方法用于写入换行符,确保每个学生信息占据文件中的一行。

这只是一个简单的例子,实际的项目中可能会涉及更复杂的数据结构和业务逻辑。在实际应用中,你可能还需要考虑异常处理、事务性操作等因素。

文章来源:https://blog.csdn.net/a89879193/article/details/135354995
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。