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之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式
字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...
随机推荐
- Java多线程调试如何完成信息输出处理
转载自:http://developer.51cto.com/art/201003/189078.htm Java多线程调试是很繁琐的,但是还是需要我们不断进行相关的学习.下面我们就来看看在Java多 ...
- windows10-seaslog安装笔记
1.seasLog在windows下的安装 首先,要下载seasLog的dll文件,下载地址:http://pecl.php.net/package/SeasLog 选择对应你的系统和php版本的d ...
- AngularJS+BootStrap的一些插件
插件网址:http://jquerypluginplus.com/ 树 1.angular-bootstrap-nav-tree http://jquerypluginplus.com/angula ...
- JGroups 初探
最近研究 JAVA 集群技术,看到 jgroups 这个框架,网上有些例子,非常简单.可以参考其官方网址:http://www.jgroups.org/manual/index.html按捺不住,自己 ...
- LBP简单实现
Local Binary Pattern 确实够简单...先写个代码在这儿,空了再弄 #include <opencv2/opencv.hpp> #include <iostream ...
- Linux下安装mantis配置指南【转】
转自:http://blog.csdn.net/xabc3000/article/details/6858229 目录(?)[-] Linux下安装mantis配置指南 配置Linux下的Apache ...
- python基础===python3 get和post请求(转载)
get请求 #encoding:UTF-8 importurllib importurllib.request data={} data['name']='aaa' url_parame=urllib ...
- 《linux下进程的创建,执行,监控和终止》
<linux下进程的创建,执行,监控和终止> http://blog.csdn.net/miss_acha/article/details/43671047 http://blog.csd ...
- vs附加到进程报MSVSMON.EXE未在远程计算机启动错误
拿到同事电脑发现居然附加不上本地进程,网上那些关防火墙更改目标平台之类的方法都没用.最后发现是后台运行着一个叫 ss_privoxy.exe 的代理软件搞的,禁用所有非系统服务重启后删掉以绝后患.
- Oracle rman 全备份的一个小例子
run{ allocate channel d1 type disk; backup database format='/u01/backup/%T_%d_%s.bak'; sql 'alter ...