java字符流缓冲区详解
程序员文章站
2024-02-22 09:15:58
本文实例为大家分享了java字符流缓冲区的具体方法,供大家参考,具体内容如下
1. 为什么要缓冲区?
程序频繁地操作一个资源(如文件),则性能会很低,此时为了提...
本文实例为大家分享了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.缓冲区原理图解
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();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。