IO流--字符流缓冲技术
缓冲技术是为了提高数据的读写效率而提出的。
(1)字符流的缓冲读
在字符流的缓冲技术中提供了一个newLine()方法,这个方法是跨平台的
在读数据的时候采用读完直接刷新的方式可以保证断电后数据不会丢失
package com.songyan.bufferedwriter; import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException; public class Demo1 {
public static void main(String[] args) throws IOException {
FileWriter writer=new FileWriter("demo1.txt");
BufferedWriter bwriter=new BufferedWriter(writer); for(int i=0;i<5;i++)
{
bwriter.write("annnn");
//newLine()是一个跨平台的换行符--》这个方法只有缓冲区中才有
bwriter.newLine();
//写一次刷新一次才能保证断电数据不丢失
bwriter.flush();
}
//缓冲区关闭其实就是流的关闭:看源码中,在缓冲区的关闭操作中关闭了流
if(bwriter!=null)
bwriter.close();
}
}
(2)字符流的缓冲写
在使用缓冲区进行读数据的时候,读一行的操作读到结尾的时候返回null
package com.songyan.bufferedreader; import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; /**
* Buffered提供了读取一行的操作,当读取到结尾时返回null
* @author Administrator
*
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
FileReader reader=new FileReader("demo1.txt");
BufferedReader breader=new BufferedReader(reader);
String line="";
while((line=breader.readLine())!=null)
{
System.out.println(line);
}
breader.close();
}
}
package com.songyan.bufferedreader; import java.awt.BufferCapabilities;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter; public class Demo2 {
/**
* 通过缓冲区复制一个.java 文件
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BufferedWriter bwriter;
FileReader reader=null;
FileWriter writer=null;
BufferedReader breader=null;
bwriter =null;
try {
reader=new FileReader("src/com/songyan/bufferedreader/Demo2.java");
writer=new FileWriter("Demo2.java");
breader=new BufferedReader(reader);
bwriter = new BufferedWriter(writer);
String line="";
while((line=breader.readLine())!=null)
{
bwriter.write(line);
bwriter.newLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(bwriter!=null)
bwriter.flush();
if(breader!=null)
bwriter.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
}
package com.songyan.bufferedreader; import java.awt.BufferCapabilities;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader; public class Demo3 { /**
* 通过缓冲区复制一个.java 文件
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BufferedWriter bwriter;
FileReader reader=null;
FileWriter writer=null;
BufferedReader2 breader=null;
bwriter =null;
try {
reader=new FileReader("src/com/songyan/bufferedreader/Demo2.java");
writer=new FileWriter("Demo3.java");
breader=new BufferedReader2(reader);
bwriter = new BufferedWriter(writer);
String line="";
while((line=breader.readLine())!=null)
{
bwriter.write(line);
bwriter.newLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(bwriter!=null)
bwriter.flush();
if(breader!=null)
bwriter.close();
} catch (Exception e) {
e.printStackTrace();
}
} }
}
/**
* 自己实现ReadLine()方法
* 这个方法实际上是对FileReader类中read()方法的增强
* 这里使用到了装饰设计模式
* 定义一个被装饰者的对象作为成员变量
* 对其某个方法进行增强
* 装饰类通常会通过构造函数将被装饰对象传入
* 通常装饰对象与被装饰对象继承自同一个类或者实现同一个接口
* @author Administrator
*
*/
class BufferedReader2 extends Reader{
/**
* 装饰设计模式与继承的区别:
* 装饰设计模式比继承更灵活,避免了继承体系的臃肿,降低了雷雨类之间的联系
*
* 装饰类因为是增强原有对象的已有功能,所以装饰类通常与被装饰类同属于一个体系
*
*/
private Reader reader;
public String readLine() throws IOException
{
StringBuilder sb=new StringBuilder();
int ch=0;
while((ch=reader.read())!=-1)
{
if((char)ch=='\r')
continue;
if((char)ch=='\n')
return sb.toString();
sb.append((char)ch);
} return null;
}
public BufferedReader2(Reader reader) {
this.reader=reader;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return reader.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
reader.close();
} }
package com.songyan.lineumberbufferedreader; import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader; public class Demo1 {
public static void main(String[] args) throws IOException {
MyLineNumberReader lnReader=new MyLineNumberReader(new FileReader("src/com/songyan/bufferedreader/Demo1.java"));
String line="";
lnReader.setLineNumber(100);
while((line=lnReader.readLine())!=null)
{
System.out.println(lnReader.getLineNumber()+":"+line);
}
}
} class MyLineNumberReader extends Reader{
private Reader reader;
private int lineNumber=0;
public MyLineNumberReader(Reader reader)
{
this.reader=reader;
}
public int getLineNumber() {
return lineNumber;
}
public String readLine() throws IOException {
lineNumber++;
StringBuilder sb=new StringBuilder();
int ch;
while((ch= reader.read())!=-1)
{
if(((char)ch)=='\r')
continue;
if((char)ch=='\n')
return sb.toString();
sb.append((char)ch);
}
return null;
}
public void setLineNumber(int i) {
this.lineNumber=i;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return reader.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
reader.close();
} }
(3)装饰类LineNumberReader
这里用到的装饰设计模式,对Reader的read()方法进行修饰,使其功能更加强大。
package com.songyan.lineumberbufferedreader; import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader; public class Demo1 {
public static void main(String[] args) throws IOException {
MyLineNumberReader lnReader=new MyLineNumberReader(new FileReader("src/com/songyan/bufferedreader/Demo1.java"));
String line="";
lnReader.setLineNumber(100);
while((line=lnReader.readLine())!=null)
{
System.out.println(lnReader.getLineNumber()+":"+line);
}
}
} class MyLineNumberReader extends Reader{
private Reader reader;
private int lineNumber=0;
public MyLineNumberReader(Reader reader)
{
this.reader=reader;
}
public int getLineNumber() {
return lineNumber;
}
public String readLine() throws IOException {
lineNumber++;
StringBuilder sb=new StringBuilder();
int ch;
while((ch= reader.read())!=-1)
{
if(((char)ch)=='\r')
continue;
if((char)ch=='\n')
return sb.toString();
sb.append((char)ch);
}
return null;
}
public void setLineNumber(int i) {
this.lineNumber=i;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return reader.read(cbuf, off, len);
}
@Override
public void close() throws IOException {
reader.close();
} }
IO流--字符流缓冲技术的更多相关文章
- IO流--字符流
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java ...
- JavaSE18-字节缓冲流&字符流
1.字节缓冲流 1.1 字节缓冲流构造方法 字节缓冲流介绍 BufferOutputStream:该类实现缓冲输出流. 通过设置这样的输出流,应用程序可以向底层输出流写 入字节,而不必为写入的每个字节 ...
- Java IO: 其他字符流(下)
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...
- Java IO流字符流简介及基本使用
Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...
- 【Java基础】【21IO(字符流)&字符流其他内容&递归】
21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写 ...
- java-IO流-字符流-FileReader、FileWriter、自定义小数组的拷贝、BufferedReader、BufferedWriter、readLine()和newLine()方法、LineNumberReader、使用指定的码表读写字符
###21.01_IO流(字符流FileReader) * 1.字符流是什么 * 字符流是可以直接读写字符的IO流 * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要 ...
- Java IO之字符流和文件
前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...
- IO流---字符流(FileWriter, FileReader ,BufferedWriter,BufferedReader)
IO Input Output IO流用来处理设备之间的数据传输. java对数据的操作是通过流来实现的. 流按流向分:输入流,输出流 是相对内存而言的.把硬盘的数据读取到内存中就是输入 ...
- java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式
字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...
随机推荐
- Create a conditional DNS forwarder on our domain.com to Amazon default DNS provider
Backgroup: I have an AWS Managed Active Directory(domain.com). I created a DHCP options set to my d ...
- 使用Idea远程部署调试tomcat
转自:http://blog.csdn.net/jane1229/article/details/52402119 远程服务器的配置: 1.在远程服务器安装jdk和tomcat 2.配置环境变量 PA ...
- 【CF1023F】Mobile Phone Network(dsu,MST)
题意: 保证原边以边权单调非减的顺序读入 思路:先把未知边加入,再加入原始边做MST,考虑从大到小,用数据结构维护,每一条原始边相当两个链赋值操作,每一条未知边相当于一个询问,答案即为询问之和 LCT ...
- [bzoj3224]Tyvj 1728 普通平衡树——splay模板
题目 你需要写一种数据结构支援以下操作. 插入元素. 删除元素. 查询元素的排名. 查询第k小的元素. 查询元素前趋. 查询元素后继. 题解 BBST裸题. 代码 #include <cstdi ...
- 基于SSM框架web搜索功能的实现
这里适合选用于jsp搭建的网站,数据库采用MySQL 一.HTML <div class="header_search"> <input type="t ...
- (转)linux samb服务器配置
1. 首先安装samba服务. 2. 配置防火墙(要先关闭) 3. 创建samba服务器用户:smbpasswd -a username 删除samba服务器用户:smbpasswd -x u ...
- BeeFramework 系列一 安装篇(Arc)
http://ilikeido.iteye.com/blog/1881390 Beeframework 是一款iOS快速开发框架,它以UISignal强大的路由功能替代原有Delegate方式,完成复 ...
- C#格式化时间,货币
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- SQL--相关子查询 与 非相关子查询
SQL 子查询可以分为相关子查询 与 非相关子查询. 假设Books表如下: 类编号 图书名 出版社 价格 ---------------------------------------------- ...
- hdu 5191(思路题)
Building Blocks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...