文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java中字符流缓冲区的作用是什么

2023-05-31 07:46

关注

本篇文章为大家展示了java中字符流缓冲区的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1. 为什么要缓冲区?

程序频繁地操作一个资源(如文件),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域中,以后直接从此区域中读取数据即可,因为读内存速度比较快,这样提高性能。在IO中引入缓冲区,主要是提高流的读写效率。

2. 缓冲技术的原理?

总的来说,缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高

3. BufferedWriter类

①. 定义

public class BufferedWriter extends Writer

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

②. 常用的方法:

// 关闭此流,但要先刷新它,实际上调用了Writer类的close方法 public void close() throws IOException // 刷新该流的缓冲 public void flush() throws IOException // 写入一个行分隔符。行分隔符字符串由系统属性 line.separator 定义 public void newLine() throws IOException // 写入字符数组的某一部分 public void write(char[] cbuf, int off, int len) throws IOException // 写入单个字符 public void write(int c) throws IOException

BufferedReader类

①.定义:

public class BufferedReader extends Reader

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

②. 常用的方法:

// 关闭该流并释放与之关联的所有资源 public void close() throws IOException // 读取一个文本行。通过下列字符之一即可认为某行已终止:换行 ('\n')、回车 ('\r') 或回车后直接跟着换行 public String readLine() throws IOException // 将字符读入数组的某一部分 public int read(char[] cbuf, int off, int len) throws IOException // 读取单个字符 public int read() throws IOException

范例:通过缓冲区复制一个文本文件

File source = new File("Demo.txt"); if (!source.exists()) {   return; } BufferedWriter bufferedWriter = null; BufferedReader bufferedReader = null; try {   bufferedReader = new BufferedReader(new FileReader(source));   bufferedWriter = new BufferedWriter(new FileWriter("Demo_copy.txt"));   String line = null;   while ((line = bufferedReader.readLine()) != null) {     bufferedWriter.write(line);     bufferedWriter.newLine();  // 换行     bufferedWriter.flush();   //将缓冲区数据刷到指定文件中   } } catch (Exception e) {   throw new RuntimeException("文件复制失败!"); } finally {   // 关闭 bufferedWriter 和 bufferedReader }

5.缓冲区原理图解

java中字符流缓冲区的作用是什么

6.根据原理图,自定义缓冲类

 public class MyBufferedRead extends Reader{      private Reader read;    private char[] buffer = new char[1024];   // 用于记录存储到缓冲区中字符个数的变量   private int count = 0;   // 用于操作数据中元素的角标   private int pos = 0;    public MyBufferedRead(Reader read) {     this.read = read;   }       public int myRead() throws IOException {     // 读取一批数据到缓冲数据buffer中     if (count == 0) {       count = read.read();       pos = 0;     }      if (count < 0)       return -1;      char ch = buffer[pos];     pos++;     count--;     return ch;   }       public String myReadLine() throws IOException {     StringBuilder stringBuilder = new StringBuilder();     int ch = 0;     while ((ch = read.read()) != -1) {       // 如果遇到此字符,则继续       if (ch == '\r') {         continue;       }       // 如果遇到此字符,表示该行读取结束       if (ch == '\n') {         return stringBuilder.toString();       }       // 将该行的字符添加到容器       stringBuilder.append((char) ch);     }     // 如果读取结束,容器中还有字符,则返回元素     if (stringBuilder.length() != 0) {       return stringBuilder.toString();     }     return null;    }       public void myClose() throws IOException {     read.close();   }    @Override   public int read(char[] cbuf, int off, int len) throws IOException {     return 0;   }    @Override   public void close() throws IOException {   } }

测试自定义缓冲类

public class MyBufferedReadDemo {      @Test   public void bufferedDemo() throws IOException{     FileReader fileReader = new FileReader("JAVA专业术语集.txt");     BufferedReader bufferedReader = new BufferedReader(fileReader);     int ch = 0;     while ((ch = bufferedReader.read()) != -1) {       System.out.print((char) ch);     }     // 关闭 bufferedReader     bufferedReader.close();   }         @Test   public void myBufferedDemo() throws IOException{     FileReader fileReader = new FileReader("JAVA专业术语集.txt");     MyBufferedRead myBufferedRead = new MyBufferedRead(fileReader);     int ch = 0;     while ((ch = myBufferedRead.myRead()) != -1) {       System.out.print((char) ch);     }     myBufferedRead.myClose();   }         @Test   public void readLineDemo() throws IOException{   FileReader fileReader = new FileReader("JAVA专业术语集.txt");     BufferedReader bufferedReader = new BufferedReader(fileReader);     String line = null;     while ((line = bufferedReader.readLine()) != null) {       System.out.println(line);     }     bufferedReader.close();      }         @Test   public void myReadLineDemo() throws IOException{     FileReader fileReader = new FileReader("JAVA专业术语集.txt");     MyBufferedRead myBufferedRead = new MyBufferedRead(fileReader);     String line = null;     while ((line = myBufferedRead.myReadLine()) != null) {       System.out.println(line);     }     myBufferedRead.myClose();     } }

①问题:上面有一个范例------缓冲区复制一个文本文件,怎么让复制后每行带有行标?
回答:

要实现此功能,最方便的是使用LineNumberReader,下面我们看下这个类

此类的定义:

public class LineNumberReaderextends BufferedReader

跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。
实现上面功能程序代码如下:

FileReader fileReader = new FileReader("tempFile\\demo.java"); LineNumberReader lineNumberReader = new LineNumberReader(fileReader); String line = null; // 设置开始行号 lineNumberReader.setLineNumber(10); while ((line = lineNumberReader.readLine()) != null) {   System.out.println(lineNumberReader.getLineNumber() + "\t" + line); } lineNumberReader.close();

上述内容就是java中字符流缓冲区的作用是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯