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之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致
先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...
- Linux下部署weblogic应用
1.Linux下weblogic安装 2.Linux下设置weblogic监听服务器地址(默认为本机) 1).修改domain\config\config.xml文件 修改 <server> ...
- 正式进入搭建OpenStack
部署mariadb数据库 控制节点: yum install mariadb mariadb-server python2-PyMySQL -y 编辑: /etc/my.cnf.d/openstack ...
- idea讲web项目部署到tomcat,热部署
idea是自动保存文件的,不需要ctrl+s手动保存. idea使用不习惯,修改了jsp文件后,刷新浏览器并没有立刻显示出来,而是要重新编译一下代码,重新部署才会出现. 在idea tomcat 中s ...
- bzoj2442&&codevs4654 单调队列优化dp
这道题也是一道单调队列 很明显满足各种性质 f[i]表示i不选前面k-1个都选的最小损失 维护的是个单增队列 q[head]是队列最小值 代码十分简介 注意longlong就okay #include ...
- 【BZOJ】1596: [Usaco2008 Jan]电话网络
[算法]树上贪心 [题解] 因为一个点必须被覆盖,那么它如果没有被子树节点覆盖的话,就覆盖它的父节点. 从叶子开始贪心. 注意,如果它自己已经被选了就不需要选父节点了. #include<cst ...
- 【洛谷 P1070】道路游戏 (DP)
题目链接 这题还是很好想的,看到\(90%\)的数据点时,我就知道要用\(n^3\)的算法(最后10分就算了吧) 然后,数据水,直接暴力\(n^3\)卡过了. 显然是道DP. 设\(f[i]\)表示第 ...
- 【洛谷 UVA11417】 GCD(欧拉函数)
我们枚举所有gcd \(k\),求所有\(gcd=k\)的数对,记作\(f(k)\),那么\(ans=\sum_{i=1}^{n}(f(i)-1)*i\).为什么减1呢,观察题目,发现\(j=i+1\ ...
- 列出top中的pid
#!/usr/bin/env python import os import string #方法1:通过字符串的isdigits来判断 #filelist = os.listdir('/proc') ...
- python自带的线程池和进程池
#python自带的线程池 from multiprocessing.pool import ThreadPool #注意ThreadPool不在threading模块下 from multiproc ...