java字符流缓冲区详解

软件编程 java 分类:[default] 更新日期: 2017-03-22
这篇文章主要为大家详细介绍了java字符流缓冲区的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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 

4. 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 { 
  /** 
   * BufferedReader 方式的read方法 
   */ 
  @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(); 
  } 
   
  /** 
   * 自定义MyBufferedRead类的myRead方法 
   */ 
  @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(); 
  } 
   
  /** 
   * BufferedReader 方式的readLine方法 
   */ 
  @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();    
  } 
   
  /** 
   * 自定义MyBufferedRead类的myReadLine方法 
   */ 
  @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(); 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!

相关文章
  • 详解表单验证正则表达式实例(推荐)
    这篇文章主要介绍了详解表单验证正则表达式实例推荐的相关资料,非常不错,具有参考借鉴价值,特此分享到平台供大家参考验证:!reg.test(value) 邮箱: 代码如下:reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/i; 不包含中文: 代码如下:r ...
  • Yii2rbac权限控制之rule教程详解
    Yii2rbac权限控制之rule教程详解
    这篇文章主要介绍了Yii2 rbac权限控制之rule教程详解的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下在我们之前Yii2搭建后台并实现rbac权限控制完整实例教程中,不知道你曾经疑惑过没有一个问题,rule表是做什么的,为什么在整个过程中我们都没有涉及到这张表? 相信我不说,部分人也都会去尝试,或百度或google,到头来也会竹篮打水,这部 ...
  • 正则表达式、分组、子匹配子模式、非捕获子匹配子模式
    正则表达式、分组、子匹配子模式、非捕获子匹配子模式
    前面我们知道正则表达式有很多元字符表示匹配次数量词,都是可以重复匹配前面出现的单个字符次数,需要的朋友可以参考下前面我们知道正则表达式有很多元字符表示匹配次数(量词),都是可以重复匹配前面出现的单个字符次数.有时候,我们可能需要匹配一组多个字符一起出现的次数.这个时候,我们需要分组了.就是用小括号来括起这些字符,指定子表达式(也叫做分组).然后你就可以指定这 ...
  • 正则表达式性能优化方法高效正则表达式书写
    正则表达式性能优化方法高效正则表达式书写
    这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式这里说的正则表达式优化,主要是针对目前常用的NFA模式正则表达式,详细可以参考:正则表达式匹配解析过程探讨分析(正则表达式匹配原理).从上面例子,我们可以推断出,影响NFA类正则表达式(常见语言:GNU Emacs,Java,ergp,less,more,.NET语言, PCRE library ...
  • PHP微信开发之文本自动回复
    PHP微信开发之文本自动回复
    这篇文章主要为大家详细介绍了PHP微信开发之简单实现文本自动回复的相关资料,感兴趣的小伙伴们可以参考一下首先,先去微信公众平台注册一个账号(注册要填的东西挺多的),注册好之后,登录进去.可以看到左侧的"开发者中心",开启开发者中心前好像还要你完善一些资料,按照步骤完善即可.进入开发者中心之后,先去编辑 修改配置,修改配置的时候,注意: U ...
  • Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
    Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
    这篇文章主要介绍了Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下今天项目经理刚交给一个活儿,要我实现这样一个功能:要实现的是验证码文本框变窄一点,然后右边加入一副验证码图片,并且在响应式布局的情况下在移动端访问的时候验证码图片能保持和验证码文本框在同一行,这个怎么做?难为了半天 ...
猜你喜欢