字符流缓冲区:
1、缓冲区的出现提高了对数据的读写效率;
2、对应类:BufferedWriter、BufferedReader;
3、缓冲区要结合流才可以使用;
4、在流的基础上对流的功能进行了增强。
 
注意:缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前必须现有流对象。
 
java.io 
类 BufferedReader:读入缓冲区
 
构造方法摘要 
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。 
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 
主要方法摘要 
 void close() 关闭该流并释放与之关联的所有资源。  
 int read() 作为一个整数(其范围从0到65535(0x00-0xffff)读入的字符,如果已到达流末尾,则返回 -1,读取单个字符。 
 int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。 
 String readLine() //包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null ,读取一个文本行。 

//例子1:

  1. import java.io.*;
  2. class BufferedReaderDemo
  3. {
  4. public static void main(String[] args) throws IOException
  5. {
  6. //创建一个字符读入流对象,和目的地文件相关联.
  7. FileReader fr = new FileReader("F:\\myfile\\buf.txt");
  8.  
  9. //为了提高字符读入流效率,加入了缓冲技术,只需要将被提高效率的流对象作为参数
  10. //传递给缓冲区的构造函数即可。此时,缓冲区和流相关联.
  11. BufferedReader buf = new BufferedReader(fr);
  12. int num = 0;
  13. String line = null;
  14.  
  15. /*
  16. while((line = buf.readLine())!=null) //此过程中,读入缓冲区一行一行的读取数据,效率高
  17. {
  18. System.out.println(line);
  19. }
  20. */
  21.  
  22. while((num = buf.read())!=-1)
  23. {
  24. System.out.print((char)num);
  25. }
  26.  
  27. //其实关闭缓冲区,就是关闭缓冲区中的流对象
  28. buf.close();
  29. }
  30. }
readLine方法的原理:尽管是读取一行获取多个字符,其实最终都是在硬盘上一个一个地读取字符。所以最终使用的还是read方法一次读一个的方法。
明白了BufferedReader类中特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法,
来模拟一个BufferedReader
(该代码中的思想体现了装饰设计模式)
//例子2:
  1. import java.io.*;
  2. class MyBufferedReader extends Reader
  3. {
  4. private Reader r;
  5. MyBufferedReader(Reader r)
  6. {
  7. this.r = r;
  8. }
  9. //可以一次读一行的方法
  10. public String MyreadLine() throws IOException
  11. {
  12. //定义一个临时容器。原BufferedReader封装的是字符数组。
  13. //为了演示方便,定义一个StringBuilder容器,因为最终还是要将数据变为字符串
  14. StringBuilder sb = new StringBuilder();
  15. int ch = 0;
  16. while((ch=r.read())!=-1)
  17. {
  18. if(ch=='\r')
  19. continue;
  20. if(ch=='\n')
  21. return sb.toString();
  22. else
  23. sb.append((char)ch);
  24. }
  25. if(sb.length()!=0) //出现读取一行数据到了缓冲区,但是该字符串后面没有'\n',可是仍要把它读取出来。
  26. return sb.toString();
  27. return null;
  28. }
  29. //覆盖Reader中的抽象方法
  30. public int read(char[] cbuf, int off, int len) throws IOException
  31. {
  32. return r.(cbuf,off,len);
  33. }
  34. public void close()throws IOException
  35. {
  36. r.close();
  37. }
  38.  
  39. public void Myclose()throws IOException
  40. {
  41. r.close();
  42. }
  43. }
    //测试类
  44. class MyBufferedReaderTest
  45. {
  46. public static void main(String[] args)
  47. {
  48. FileReader fr = null;
  49. MyBufferedReader mybuf = null;
  50. String line = null;
  51. try
  52. {
  53. mybuf = new MyBufferedReader(new FileReader("F:\\myfile\\buf.txt"));
  54. while((line = mybuf.MyreadLine())!=null)
  55. {
  56. System.out.println(line);
  57. }
  58. }
  59. catch(IOException e)
  60. {
  61. throw new RuntimeException("读入流异常");
  62. }
  63. finally
  64. {
  65. try
  66. {
  67. mybuf.Myclose();
  68. }
  69. catch(IOException e)
  70. {
  71. throw new RuntimeException("关闭流异常");
  72. }
  73. }
  74. }
  75. }

自定义一个统计行号的类:MyLineNumberReader,可以设置复制得到的文件内容的行号

//例子3:
  1. import java.io.*;
  2. /*
  3. class MyLineNumberReader extends MyBufferedReader
  4. {
  5. private int linenumber;
  6. MyLineNumberReader(Reader r)
  7. {
  8. super(r);
  9. }
  10. public void setLineNumber(int linenumber)
  11. {
  12. this.linenumber = linenumber;
  13. }
  14. public int getLineNumber()
  15. {
  16. return linenumber;
  17. }
  18. public String MyreadLine() throws IOException
  19. {
  20. linenumber++;//每读一行,行数就自加一次
  21. return super.MyreadLine();
  22. }
  23. }
  24. */
  25. class MyLineNumberReader
  26. {
  27. private Reader r;
  28. private int linenumber;
  29. MyLineNumberReader(Reader r)
  30. {
  31. this.r = r;
  32. }
  33. public void setLineNumber(int linenumber)
  34. {
  35. this.linenumber = linenumber;
  36. }
  37. public int getLineNumber()
  38. {
  39. return linenumber;
  40. }
  41. public String MyreadLine() throws IOException
  42. {
  43. linenumber++;//每读一行,行数就自加一次
  44. StringBuilder sb = new StringBuilder();
  45. int ch = 0;
  46. while((ch = r.read())!=-1)
  47. {
  48. if(ch=='\r')
  49. continue;
  50. if(ch=='\n')
  51. return sb.toString();
  52. else
  53. sb.append((char)ch);
  54. }
  55. if(sb.length()!=0)
  56. return sb.toString();
  57. return null;
  58. }
  59. public void Myclose() throws IOException
  60. {
  61. r.close();
  62. }
  63. }
  64. class MyLineNumberReaderDemo
  65. {
  66. public static void main(String[] args)
  67. {
  68. FileReader fr = null;
  69. MyLineNumberReader myl = null;
  70. String str = null;
  71. try
  72. {
  73. fr = new FileReader("MyBufferedReaderTest.java");
  74. myl = new MyLineNumberReader(fr);
  75. //myl.setLineNumber(100); //设置第一行从101行开始
  76. while((str = myl.MyreadLine())!=null)
  77. {
  78. System.out.println(myl.getLineNumber()+":"+str);
  79. }
  80. }
  81. catch(IOException e)
  82. {
  83. System.out.println("流读入异常!");
  84. }
  85. finally
  86. {
  87. try
  88. {
  89. myl.Myclose();
  90. }
  91. catch(IOException e)
  92. {
  93. System.out.println("流关闭异常!");
  94. }
  95.  
  96. }
  97. }
  98. }
java.io 
类 BufferedWriter:写入缓冲区

构造方法摘要

BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。

BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

方法摘要

void close() 关闭此流,但要先刷新它。

void flush() 刷新该流的缓冲。

void newLine() 写入一个行分隔符。具有跨平台性,相当于windows系统的"\r\n"和linux系统的"\n";

void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。

void write(int c) 写入单个字符。

void write(String s, int off, int len) 写入字符串的某一部分。

//例子4:
  1. import java.io.*;
  2. class BufferedWriterDemo
  3. {
  4. public static void main(String[] args) throws IOException
  5. {
  6. //创建一个字符写入流对象,和目的地文件相关联.
  7. FileWriter fw = new FileWriter("F:\\myfile\\buf.txt");
  8.  
  9. //为了提高字符写入流效率,加入了缓冲技术,只需要将被提高效率的流对象作为参数
  10. //传递给缓冲区的构造函数即可。此时,缓冲区和流相关联.
  11. BufferedWriter buf = new BufferedWriter(fw);
  12.  
  13. buf.write("abcdefg");
  14. for(int i=0;i<3;i++)
  15. {
  16. buf.newLine();//换行
  17. buf.write("changjiang"+i);
  18. //记住,只要用到缓冲区,必须要刷新
  19. buf.flush();
  20. }
  21. //其实关闭缓冲区,就是关闭缓冲区中的流对象
  22. buf.close();
  23. }
  24. }
使用字符流缓冲的一个综合实例如下:
要求:通过一个缓冲区复制一个.java文件
注意:readLine()方法返回的时候只返回回车符之前的数据内容,并不返回回车符。
//例子5: 没有异常处理时:
  1. import java.io.*;
  2. class BufferedCopyTest
  3. {
  4. public static void main(String[] args)throws IOException
  5. {
  6. //创建一个读入流对象,与要被复制的文件相关联
  7. FileReader fr = new FileReader("BufferedReaderDemo.java");
  8. //创建一个写入流对象,与目的文件相关联
  9. FileWriter fw = new FileWriter("BufferedReaderDemo_Copy.txt");
  10.  
  11. //创建一个读入缓冲区,与流对象相关联
  12. BufferedReader bufr = new BufferedReader(fr);
  13. //创建一个写入缓冲区,与流对象相关联
  14. BufferedWriter bufw = new BufferedWriter(fw);
  15.  
  16. //读取数据存入缓冲区中
  17. String line;
  18. while((line = bufr.readLine())!=null)
  19. {
  20. bufw.write(line);
  21. bufw.newLine();
  22. bufw.flush();
  23. }
  24. bufw.close();
  25. bufr.close();
  26. }
  27. }
//例子6: 有异常的处理时:
  1. import java.io.*;
  2. class BufferedCopyTest2
  3. {
  4. public static void main(String[] args)
  5. {
  6. BufferedReader bufr = null;
  7. BufferedWriter bufw = null;
  8. try
  9. {
  10. bufr = new BufferedReader(new FileReader("BufferedReaderDemo.java"));
  11. bufw = new BufferedWriter(new FileWriter("BufferedReader_Copy.txt"));
  12. String line;
  13. while((line = bufr.readLine())!=null)
  14. {
  15. System.out.println(line);
  16. bufw.write(line);
  17. bufw.newLine();
  18. bufw.flush();
  19. }
  20. }
  21. catch(IOException e)
  22. {
  23. throw new RuntimeException("读写入异常");
  24. }
  25. finally
  26. {
  27. try
  28. {
  29. if(bufr!=null)
  30. bufr.close();
  31. }
  32. catch(IOException e)
  33. {
  34. throw new RuntimeException("关闭流异常");
  35. }
  36. try
  37. {
  38. if(bufw!=null)
  39. bufw.close();
  40. }
  41. catch(IOException e)
  42. {
  43. throw new RuntimeException("关闭流异常");
  44. }
  45. }
  46. }
  47. }
 

Java:IO流之字符流缓冲区详解的更多相关文章

  1. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  2. Java IO 字节流与字符流 (五)

    Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...

  3. java IO(三):字符流

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  5. Java IO 字节流与字符流 (二)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  6. Java——IO类,字符流写数据

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  7. Java——IO类,字符流读数据

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  8. 缓冲字符流 java.io.BufferedWriter ,java.io.BufferedReader,缓冲字符输出流:PrintWriter

    package seday07; import java.io.IOException;import java.io.PrintWriter; /*** @author xingsir * 缓冲字符流 ...

  9. java IO流 之 字符流

    字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...

  10. JAVA之IO流(字符流)

    字符流InputStreamReader和OutputStreamWriter是Writer和Read的子类:是字节流通向字符流的桥梁,也就是可以把字节流转化为字符流. InputStreamRead ...

随机推荐

  1. 如何使用css和jquery控制文章标题字数?

    如何使用css控制文章标题字数? 最佳答案 控制文章标题字数,不是动态网页的专利,如果静态页面使用CSS样式,也可以实现相同的效果! 看这个例子,你们可以复制到记事本保存为HTML文件看效果! < ...

  2. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  3. Ngrok 内网穿透神器(转载)

    mac上配置web服务: http://note.rpsh.net/posts/2013/11/27/osx-10-9-apache-server-php-mysql/ Ngrok 内网穿透神器 由于 ...

  4. Netsharp介绍

    1.1     Netsharp是什么 Netsharp定义: Netsharp业务基础平台 = 1.系统框架 + 2.元数据 + 3.平台工具 + 4.基础业务 + 5.二次开发 此五个概念请参考什 ...

  5. 前端之JavaScript第三天学习(8)-JavaScript-对象

    JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 在 JavaScript 中,对象是拥有属性和方法的数据. 属性和方法 属性是与对象相关的值. 方法是能够在对象上执行的动 ...

  6. JavaScript 异常

    转载自:http://www.cnblogs.com/aqbyygyyga/archive/2011/10/29/2228824.html(排版格式修改了一下) 一.错误处理的重要性 以前,javas ...

  7. 使用try-with-resources注意的问题

    package coin; import java.io.FileInputStream; import java.io.ObjectInputStream; /** * 使用 try-with-re ...

  8. 成为嵌入式程序员应知道的0x10个基本问题

    预处理器(Preprocessor)1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 2 ...

  9. 1051: [HAOI2006]受欢迎的牛

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2276  Solved: 1190[Submit][Sta ...

  10. 15 个最佳的 jQuery 表格插件

    现如今,网站开发设计的需求会要求自动适应所有移动设备,即响应式网站: 在开发网站时必须考虑对平板设备融合 fluid(流)和自适应性特点. 大多数网站设计要靠margins, guides, rows ...