IO(7)----缓冲流

版权声明:未经同意,严禁转载 https://blog.csdn.net/pengchengliu/article/details/82924507

1. 字节缓冲流                                                                                                                                                点击此处返回总目录

  1.1 字节输入流缓冲流

  1.2 字节输出流缓冲流

  1.3 总结:使用字节流进行文件复制的四种方式对比

2. 字符缓冲流

  2.1 字符输入流缓冲流

  2.2 字符输出流缓冲流

  2.3 使用字符流缓冲流进行文件复制

前面学习了字节流和字符流,当读取数据量大的文件时,读取的速度会很慢,影响了程序的效率。因此,Java提供了一套缓冲流,用来提高IO流的读写速度。

Java提供给我们了四个缓冲流:

BufferedInputStream 

BufferedOutputStream

BufferedReader

BufferedWriter

这四个流可以提高读写效率。 

1. 字节缓冲流

字节缓冲流有两个:

字节输出流缓冲流  BufferedOutputStream    写入数据到流中

字节输入流缓冲流  BufferedInputStream       读取流中的数据

1.1 BufferedOutputStream  字节输出流的缓冲流 

作用:提高原有输出流的写入效率

如何提高效率的?

       通过设置这种流,应用程序可以将各个字节写入底层输出流中,等凑够了多个一次性调用底层的系统,而不必针对每次字节写入调用底层系统。

继承关系:

java.lang.Object

    java.io.OutputStream

         java.io.FilterOutputStream

              java.io.BufferedOutputStream

继承自OutputStream,所以是一个字节输出流。方法都是write。

构造方法:

BufferedOutputStream(OutputStream out)              //可以传递任意的字节输出流。传递的是哪个字节流,就对哪个字节流提高效率。

BufferedOutputStream(OutputStream out, int size)

使用跟字节输出流没什么区别,但是效率比较快。

例1:

package cn.itcast.demo07;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        FileOutputStream fos = new FileOutputStream("e:\\a.txt");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        byte[] b ="hello".getBytes();
        
        bos.write(b);
        
        bos.close();
    }
}

1.2 BufferedInputStream 字节输入流的缓冲流

与字节输出流缓冲流相似。

继承自InputStream。

构造方法中可以传入任意的字节输入流,传递的是谁,就提高谁的效率。

直接看使用吧~

例1:

package cn.itcast.demo08;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        BufferedInputStream bis = new 
                BufferedInputStream(new FileInputStream("e:\\a.txt"));                    //直接使用匿名的了。
        byte[] b = new byte[1024];
        int len = 0;
        while((len = bis.read(b))!=-1){
            System.out.print(new String(b,0,len));
        }
        
        bis.close();
    }
}

1.3 总结:使用字节流进行文件复制的四种方式对比

目前一共学习了,四种使用字节流进行文件复制的方式,分别是:

方式1:字节流,单个字节复制

方式2:字节流,使用字节数组进行复制

方式3:字节流缓冲流,单个字节进行复制

方式4:字节流缓冲流,使用字节数组进行复制

package cn.itcast.demo09;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        long begin = System.currentTimeMillis();
        copy_4("e:\\a.exe","f:\\a.exe");
        long end = System.currentTimeMillis();
        System.out.println(end - begin);
        
    }
    
    //字节流,单个字节
    public static void copy_1(String from ,String to) throws IOException{
        FileInputStream fis = new FileInputStream(from);
        FileOutputStream fos = new FileOutputStream(to);
        int b = 0;
        while((b = fis.read())!=-1){
            fos.write(b);
        }
        
    }
    
    //字节流,字节数组  
    public static void copy_2(String from, String to) throws IOException{
        FileInputStream fis = new FileInputStream(from);
        FileOutputStream fos = new FileOutputStream(to);
        int len = 0;
        byte[] b = new byte[1024];
        while((len = fis.read(b))!=-1){
            fos.write(b,0,len);
        }
    }
    
    //字节流缓冲流,单个字节  
    public static void copy_3(String from, String to) throws IOException{
        BufferedInputStream bis = new 
                BufferedInputStream(new FileInputStream(from));
        BufferedOutputStream bos = new 
                BufferedOutputStream(new FileOutputStream(to));
        int b = 0;
        while((b = bis.read())!=-1){
            bos.write(b);
        }
    }
    
    //字节流缓冲流,字节数组
    public static void copy_4(String from, String to) throws IOException{
        BufferedInputStream bis = new 
                BufferedInputStream(new FileInputStream(from));
        BufferedOutputStream bos = new 
                BufferedOutputStream(new FileOutputStream(to));
        int len = 0;
        byte[] b = new byte[1024];
        while((len = bis.read(b))!=-1){
            bos.write(b,0,len);
        }
    }

}

复制181兆的文件,实验结果如下:

方式一  好久好久,不想跑了都。

方式二  3540毫秒,3秒半,还可以

方式三  10282毫秒,10秒左右

方式四  1181毫秒,1秒多就完了。

带缓存的比不带缓存的快。数组的比单个字节的快。

所以,如果要复制文件。一定要用数组的方式,即方式二、四。

2. 字符缓冲流

字符缓冲流有两个:

字符输出流缓冲流  BufferedWriter

字符输入流缓冲流  BufferedReader

2.1 BufferedWriter

java.lang.Object

     java.io.Writer

          java.io.BufferedWriter

构造方法:

BufferedWriter(Writer w)                    //可以传任意的字符输出流,传谁就高效谁

特有方法:

void  newLine()                                 //写换行。前面在字节输出流的时候讲过write()方法中加入"\r\n"来换行。但是这个类中提供了独特的                                                             方法。

                                                         //使用的时候推荐使用newLine()。因为这个方法具有平台无关性。即,跨越操作系统平台。

                                                         //在windows操作系统下,换行符号是\r\n,而在Linux下,换行符是\n。所以使用\r\n只能在windows                                                             下面使用。使用newLine()方法,可以避开操作系统的差异。

例1:

package cn.itcast.demo10;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("d:\\aa.txt");
        BufferedWriter bw = new BufferedWriter(fw);
        
        bw.write(100);
        bw.newLine();
        bw.flush();
        
        bw.write("你好".toCharArray());
        bw.newLine();
        bw.flush();
        
        bw.write("大家好");
        bw.flush();
        
        bw.close();
    }
}

2.2 BufferedReader

字符输入流缓冲流

java.lang.Object

     java.io.Reader

          java.io.BufferedReader

构造方法:

BufferedReader(Reader r)                    //可以传任意的字符输入流,传谁就高效谁

特有方法:

String readLine()                                   //读取文本行。只返回了一行的有效字符,并不包含换行符。当读取到末尾时,返回null。【例2】

例1:

package cn.itcast.demo11;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("e:\\aaa.txt"));
        char[] ch = new char[1024];
        int len = 0;
        while((len = br.read(ch))!=-1){
            System.out.print(new String(ch,0,len));
        }
    }
}

例2:

package cn.itcast.demo11;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("e:\\aaa.txt"));
        char[] ch = new char[1024];
        int len = 0;
        while((len = br.read(ch))!=-1){
            System.out.print(new String(ch,0,len));
        }
    }
}

2.3 使用字符流缓冲流进行文件复制

要求:读一行,写一行。

package cn.itcast.demo13;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new FileReader("e:\\aaa.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\bbb.txt"));
        String line = null;
        while((line = br.readLine())!=null){
            bw.write(line);
            bw.newLine();                               //因为readLine()没有读出换行符来,所以应当写一个换行。
            bw.flush();
        }
        
        bw.close();
        br.close();
    }

}

说明:

比较最后的文件发现不完全一致。因为bbb.txt比aaa.txt最后多了一个空行。但是因为是文本文件,所以最后多一个空行,没有什么影响。

猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/82924507