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之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式
字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...
随机推荐
- CI框架浅析
CI框架浅析(全篇) 业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本. CI是一个很 ...
- iebackground+icon图标兼容
<!DOCTYPE > <html> <head> <title>zepto</title> <meta name="nam ...
- Spring学习--泛型依赖注入
暂时没有搞懂.
- 表单元素 disabled 和 readonly 辨析
正确答案: B D 分析: Readonly 和 Disabled 是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: 1)Readonly只 ...
- 图论:Stoer-Wagner算法
利用Stoer-Wagner算法求无向图最小割 直接给出算法描述和过程实现: 算法步骤: . 设最小割cut=INF, 任选一个点s到集合A中, 定义W(A, p)为A中的所有点到A外一点p的权总和. ...
- swift方法 的写法,ui上拖拽的控件到controller里面的方法
直接点xcode右上角三个按键中间一下,左右拆分为storyboard和controller, 点击button,按ctrl,然后拖拽到controller里面即可生成对应的点击事件在controll ...
- bzoj 1067 特判
这道题的大题思路就是模拟 假设给定的年份是x,y,首先分为4个大的情况,分别是 x的信息已知,y的信息已知 x的信息已知,y的信息未知 x的信息未知,y的情况已知 x的信息未知,y的情况未知 然后对于 ...
- bzoj 2151 贪心
几乎完全类似于1150的思路,直接参考那个就行了. http://www.cnblogs.com/BLADEVIL/p/3527193.html /************************** ...
- 【Shell 编程基础第一部分】第一个Shell脚本HelloShell及一些简单的Shell基础书写与概念;
http://blog.csdn.net/xiaominghimi/article/details/7603000 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Flask应用部署
1. 介绍 前面介绍了<Linux下Nginx使用>, 但是Nginx是一个提供静态文件访问的web服务 首先我们介绍一下Web服务器, 应用服务器和应用框架的关系 客户端: 浏览器或者a ...