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();
    }

}

原文地址:https://www.cnblogs.com/excellencesy/p/9189946.html

时间: 2024-10-10 05:00:54

IO流--字符流缓冲技术的相关文章

黑马程序员——java基础---IO(input output)流字符流

黑马程序员——java基础---IO(input output)流字符流 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- io(input output)流特点: 1,io流用来处理数据之间的传输 2,java对数据的操作是通过流的方式: 3,java用于操作流的对象都在io包中: 4,流按操作数据分为两种:字节流和字符流: 5,流按流向分为:输入流和输出流. 注意:流只能操作数据,而不能操作文件. 3.IO流的常用基类: 1)字节流的抽象

java021.io流 字符流

注意:字节流可以操作任意数据,但是字符流只能操作纯文本文件,一般用于文本文件的只读或只写! 字符流是什么 * 字符流是可以直接读写字符的IO流 * 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出. FileReader类的read()方法可以按照字符大小读取FileWriter类的write()方法可以自动把字符转为字节写出 字符流用处和特点:* 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字

黑马程序员——java基础IO流——字符流缓冲区和字节流

字符流的缓冲区 l  缓冲区的出现提高了对数据的读写效率. l  对应类 ?    BufferedWriter ?    BufferedReader l  缓冲区要结合流才可以使用. l  在流的基础上对流的功能进行了增强. 1, BufferedWriter 每次可以写入一行,缓冲区的出现是为了提高流的操作效率而出现的.所以在创建缓冲区之前,必须要先有流对象.该缓冲区中提供了一个跨平台的换行符,newLine(); /* 缓冲区的出现是为了提高流的操作效率而出现的. 所以在创建缓冲区之前,

IO流--字符流写数据

IO流是用来处理设备之间的数据传输的,诸如:文件的复制,上传下载文件 Java中的流可以从不同的角度进行分类: - 按照流的方向不同:分为输入流和输出流. - 按照处理数据单位的不同:分为字节流和字符流. - 按照功能不同:分为节点流和处理流 要区分字符流和字节流,我们可以从类名来区分 类名中包含Reader:字符流  输入流 类名中包含Writer:字符流  输出流 类名中包含Input:字节流  输入流 类名中包含Output:字节流  输出流 包含Stream:字节流 今天着重来看下字符流

[学习笔记]Java IO之字符流

概述 字符流是专门用于处理文本文件的流,其中包括了文本编码相关转换工作. 字符流只可以处理文本字符数据. 每个字符流都包括一种编码方式,可以使用系统默认,也可以自行设定. 编码 1. 编码表 生活中语言文字和计算机中对应的数据表 2. 常见编码表 ASCII:包括字母和常见符号,1字节编码,首位为0. ISO8859-1:包括拉丁字母,1字节编码,首位为1. GB2312:简体中文码表,包括6~7千汉子及符号,2字节编码,2个字节首位均为1. GBK:中文码表,包括GB2312全部编码,约2万个

Java IO流-字符流

2017-11-05 18:34:39 Java中的IO流按数据类型分类分为两种,一是字节流,二是字符流.字符流的出现是为了简化文本数据的读入和写出操作. 如果操作的文件是文本文件,那么使用字符流会大大简化操作,但是如果什么都不知道,就用字节流. 字符流 由于字节流中读取中文不是很方便,所以Java中提供了转换流,所以 字符流 = 字节流 + 编码表(By the way,'a'=97,'A'=65,'0'=48). 字符流也有两个抽象基类:Writer Reader * OutputStrea

文本数据IO操作--字符流

一.Reader和Writer 1. 字符流原理 Reader是所有字符输入流的父类而Writer是所有字符输出流的父类.字符流是以字符(char)为单位读写数据的.一次处理一个unicode.字符流都是高级流,其底层都是依靠字节流进行读写数据的,所以底层仍然是基于字节读写数据的.2. 常用方法 Reader的常用方法:int read()读取一个字符,返回的int”值低16”位有效. 其实返回的是char 若返回的是-1 则读取到末尾 int read(char[] chs)从该流中读取一个字

Java学习笔记之 IO包 字符流

字符流:Writer/Reader(字符流) 通过子类FileWriter和FileReader实现父类实例化 package iotest; import java.io.File; import java.io.Writer; import java.io.Reader; import java.io.FileWriter; import java.io.FileReader; public class OutputStreamDemo2 { public static void main(

JAVA基础——IO流字符流

字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为上一篇文章写了,一个Unicode字符占用2个字节,而字节流一次只能操作一个字节.既然Java的口号就是"一次编写.处处运行",那么包含直接的字符输入/输出的支持是必要的.因此就有一些字符输入/输出流,之前已经说明过了,字符流顶层是Reader和Writer这两个抽象类,因此就从这里开始本文. Reader Reader