字符流缓冲区:
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:

import java.io.*;
class BufferedReaderDemo
{
public static void main(String[] args) throws IOException
{
//创建一个字符读入流对象,和目的地文件相关联.
FileReader fr = new FileReader("F:\\myfile\\buf.txt"); //为了提高字符读入流效率,加入了缓冲技术,只需要将被提高效率的流对象作为参数
//传递给缓冲区的构造函数即可。此时,缓冲区和流相关联.
BufferedReader buf = new BufferedReader(fr);
int num = 0;
String line = null; /*
while((line = buf.readLine())!=null) //此过程中,读入缓冲区一行一行的读取数据,效率高
{
System.out.println(line);
}
*/ while((num = buf.read())!=-1)
{
System.out.print((char)num);
} //其实关闭缓冲区,就是关闭缓冲区中的流对象
buf.close();
}
}
readLine方法的原理:尽管是读取一行获取多个字符,其实最终都是在硬盘上一个一个地读取字符。所以最终使用的还是read方法一次读一个的方法。
明白了BufferedReader类中特有方法readLine的原理后,
可以自定义一个类中包含一个功能和readLine一致的方法,
来模拟一个BufferedReader
(该代码中的思想体现了装饰设计模式)
//例子2:
import java.io.*;
class MyBufferedReader extends Reader
{
private Reader r;
MyBufferedReader(Reader r)
{
this.r = r;
}
//可以一次读一行的方法
public String MyreadLine() throws IOException
{
//定义一个临时容器。原BufferedReader封装的是字符数组。
//为了演示方便,定义一个StringBuilder容器,因为最终还是要将数据变为字符串
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=r.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0) //出现读取一行数据到了缓冲区,但是该字符串后面没有'\n',可是仍要把它读取出来。
return sb.toString();
return null;
}
//覆盖Reader中的抽象方法
public int read(char[] cbuf, int off, int len) throws IOException
{
return r.(cbuf,off,len);
}
public void close()throws IOException
{
r.close();
} public void Myclose()throws IOException
{
r.close();
}
}
//测试类
class MyBufferedReaderTest
{
public static void main(String[] args)
{
FileReader fr = null;
MyBufferedReader mybuf = null;
String line = null;
try
{
mybuf = new MyBufferedReader(new FileReader("F:\\myfile\\buf.txt"));
while((line = mybuf.MyreadLine())!=null)
{
System.out.println(line);
}
}
catch(IOException e)
{
throw new RuntimeException("读入流异常");
}
finally
{
try
{
mybuf.Myclose();
}
catch(IOException e)
{
throw new RuntimeException("关闭流异常");
}
}
}
}

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

//例子3:
import java.io.*;
/*
class MyLineNumberReader extends MyBufferedReader
{
private int linenumber;
MyLineNumberReader(Reader r)
{
super(r);
}
public void setLineNumber(int linenumber)
{
this.linenumber = linenumber;
}
public int getLineNumber()
{
return linenumber;
}
public String MyreadLine() throws IOException
{
linenumber++;//每读一行,行数就自加一次
return super.MyreadLine();
}
}
*/
class MyLineNumberReader
{
private Reader r;
private int linenumber;
MyLineNumberReader(Reader r)
{
this.r = r;
}
public void setLineNumber(int linenumber)
{
this.linenumber = linenumber;
}
public int getLineNumber()
{
return linenumber;
}
public String MyreadLine() throws IOException
{
linenumber++;//每读一行,行数就自加一次
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch = r.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void Myclose() throws IOException
{
r.close();
}
}
class MyLineNumberReaderDemo
{
public static void main(String[] args)
{
FileReader fr = null;
MyLineNumberReader myl = null;
String str = null;
try
{
fr = new FileReader("MyBufferedReaderTest.java");
myl = new MyLineNumberReader(fr);
//myl.setLineNumber(100); //设置第一行从101行开始
while((str = myl.MyreadLine())!=null)
{
System.out.println(myl.getLineNumber()+":"+str);
}
}
catch(IOException e)
{
System.out.println("流读入异常!");
}
finally
{
try
{
myl.Myclose();
}
catch(IOException e)
{
System.out.println("流关闭异常!");
} }
}
}
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:
import java.io.*;
class BufferedWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个字符写入流对象,和目的地文件相关联.
FileWriter fw = new FileWriter("F:\\myfile\\buf.txt"); //为了提高字符写入流效率,加入了缓冲技术,只需要将被提高效率的流对象作为参数
//传递给缓冲区的构造函数即可。此时,缓冲区和流相关联.
BufferedWriter buf = new BufferedWriter(fw); buf.write("abcdefg");
for(int i=0;i<3;i++)
{
buf.newLine();//换行
buf.write("changjiang"+i);
//记住,只要用到缓冲区,必须要刷新
buf.flush();
}
//其实关闭缓冲区,就是关闭缓冲区中的流对象
buf.close();
}
}
使用字符流缓冲的一个综合实例如下:
要求:通过一个缓冲区复制一个.java文件
注意:readLine()方法返回的时候只返回回车符之前的数据内容,并不返回回车符。
//例子5: 没有异常处理时:
import java.io.*;
class BufferedCopyTest
{
public static void main(String[] args)throws IOException
{
//创建一个读入流对象,与要被复制的文件相关联
FileReader fr = new FileReader("BufferedReaderDemo.java");
//创建一个写入流对象,与目的文件相关联
FileWriter fw = new FileWriter("BufferedReaderDemo_Copy.txt"); //创建一个读入缓冲区,与流对象相关联
BufferedReader bufr = new BufferedReader(fr);
//创建一个写入缓冲区,与流对象相关联
BufferedWriter bufw = new BufferedWriter(fw); //读取数据存入缓冲区中
String line;
while((line = bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
}
//例子6: 有异常的处理时:
import java.io.*;
class BufferedCopyTest2
{
public static void main(String[] args)
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
bufr = new BufferedReader(new FileReader("BufferedReaderDemo.java"));
bufw = new BufferedWriter(new FileWriter("BufferedReader_Copy.txt"));
String line;
while((line = bufr.readLine())!=null)
{
System.out.println(line);
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}
catch(IOException e)
{
throw new RuntimeException("读写入异常");
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch(IOException e)
{
throw new RuntimeException("关闭流异常");
}
try
{
if(bufw!=null)
bufw.close();
}
catch(IOException e)
{
throw new RuntimeException("关闭流异常");
}
}
}
}
 

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. hibernate 超级牛x的公共类

    想法,能支持in查询和 =查询的 公共方法,类似下面实现 用 泛型 实现 参数 getList(String[] params,Object[] values){} for(int i=0;i< ...

  2. 【原创】只用 HTML / CSS 画出一把 UKULELE(夏威夷四弦吉他)

    在线演示:http://abelyao.github.io/ukulele/  源代码: https://github.com/AbelYao/css-ukulele  效果图:   为了熟练 CSS ...

  3. 用时间复杂度为n的方法找出水王

    一.题目       三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖 数目超过了帖子数目 ...

  4. “我爱淘”冲刺阶段Scrum站立会议1

    昨天是我们项目冲刺阶段的第一天,站立会议的内容如下: 1.昨天完成了项目中的第一个界面--“精选”界面:完成了一点Java文件的编写: 2.今天的任务就是完成第一个Activity的编写:将布局文件和 ...

  5. CoffeeRobotTeam项目组报告

    一.小组分工 模块 任务 责任人 备注 报告 需求分析 熊振威 功能分析 熊振威 项目报告 熊振威 人机界面 秦勤.洪超 单元测试 姜进.张文强 机器人代码 机器人类 徐意.余拥军.孙智博 机器人运动 ...

  6. 微软Hololens学院教程-Hologram 220-空间声音(Spatial sound )【本文是老版本,与最新的微软教程有出入】

    这是老版本的教程,为了不耽误大家的时间,请直接看原文,本文仅供参考哦! 原文链接https://developer.microsoft.com/EN-US/WINDOWS/HOLOGRAPHIC/ho ...

  7. android 下载图片出现SkImageDecoder::Factory returned null,BitmapFactory.Options压缩

    网上有很多说是因为没有采用HttpClient造成的,尼玛,我改成了HttpClient 请求图片之后还是会出现SkImageDecoder::Factory returned null, 但是直接使 ...

  8. 【Valid Palindrome】cpp

    题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ig ...

  9. IOS常用加密DES

    NSString+DES.h // // NSString+DES.h // haochang // // Created by Administrator on 14-4-15. // Copyri ...

  10. sao/jsp

    sao/i18n/message/ Messages-Client.xml   Messages-Server.xml   sao/wsdl Verification.wsdl   IProcessS ...