文件流之字节缓冲流(BufferedInputStream BufferedOutputStream)

  • 缓冲流的优势是:

  BufferedInputStream: 输入缓冲流:先从磁盘中将要读取的内容放入到内存中,再一次性从内存中取出来,避免了读一段取一段;

  BufferedOutputStream: 输出缓冲流:先将要输出的内容放入到内存中,再一次性全都输出。

  • 缓冲流的构造函数:
public BufferedInputStream(InputStream in) {
            this (in, DEFAULT_BUFFER_SIZE);
    }
public BufferedInputStream(InputStream in, int size) {
            super (in);
            if (size <= 0 ) {
                throw  new IllegalArgumentException("Buffer size <= 0" );
        }
        buf = new  byte [size];
    }
public BufferedOutputStream(OutputStream out) {
            this (out, 8192 );
    }
public BufferedOutputStream(OutputStream out, int size) {
            super (out);
            if (size <= 0 ) {
                throw  new IllegalArgumentException("Buffer size <= 0" );
        }
        buf = new  byte [size];
    }
  • 缓冲流关闭:

只需将缓冲流关闭,无需将节点流关闭,因为缓冲流内部会自动调用节点流关闭。

  • 缓冲流需要调用flush()方法才能将内容输入或输出出来,或者调用close()方法时,也会调用flush()方法。
  • 注意:

    new FileOutputStream("***"); 如果参数中的路径有目录不存在,并不会自动创建目录;

    此外:调用File 类的mkdir()或mkdirs()可能出现错误“Access is denied”,暂时还没解决。

  • 缓冲流的应用
public class BufferedStream {

    public static void main(String[] args) {
        //BufferedStream fbs = new BufferedStream();
        // fbs.writeFileWithBufferedStream("HelloBufferedOutputStream",
        // "/home/rding/bufferd.txt");
        // fbs.readFileWithBufferedStream("/home/rding/bufferd.txt");
        //fbs.writeFileWithBufferedStream("HelloWorld", "d:/rding/rding/buffered.txt");

        String str = "c:\\cc\\cc";
        System.out.println(str.lastIndexOf("\\"));
    }

    public void readFileWithBufferedStream(String srcPath, int size) {
        InputStream inputStream = null;
        BufferedInputStream bufferedInputStream = null;
        StringBuffer sb = new StringBuffer();
        try {
            inputStream = new FileInputStream(srcPath);
            bufferedInputStream = new BufferedInputStream(inputStream);
            byte[] byteArr = new byte[size];
            int len = 0;
            while ((len = bufferedInputStream.read(byteArr)) != -1) {
                sb.append(new String(byteArr), 0, len);
            }
            System.out.println(sb);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void readFileWithBufferedStream(String srcPath) {
        InputStream inputStream = null;
        BufferedInputStream bufferedInputStream = null;
        try {
            inputStream = new FileInputStream(srcPath);
            bufferedInputStream = new BufferedInputStream(inputStream);
            int size = bufferedInputStream.available();
            byte[] byteArr = new byte[size];
            bufferedInputStream.read(byteArr);
            String str = new String(byteArr);
            System.out.println(str);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void writeFileWithBufferedStream(String content, String destPath) {
        OutputStream outputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {

            // 下面的语句中,如果destPath中的目录不存在,不会自动创建目录,因此,建议使用下面的代码
            // outputStream = new FileOutputStream(destPath);
       // 前提是输出的路径是"/"而不是"\\"
            File tmp = new File(destPath.substring(0, destPath.lastIndexOf("/")));
            if(!tmp.exists()){
                tmp.mkdirs();
            }
            outputStream = new FileOutputStream(destPath);
            bufferedOutputStream = new BufferedOutputStream(outputStream);

            byte[] byteArr = content.getBytes();
            bufferedOutputStream.write(byteArr);
            bufferedOutputStream.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public void copyFileWithBufferedStream(String srcPath, String destPath, int size) {
        InputStream inputStream = null;
        BufferedInputStream bufferedInputStream = null;

        OutputStream outputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        try {
            inputStream = new FileInputStream(srcPath);

            // 下面的语句中,如果destPath中的目录不存在,不会自动创建目录,因此,建议使用下面的代码
            // outputStream = new FileOutputStream(destPath);

            File tmp = new File(destPath.substring(0, destPath.lastIndexOf("/")));
            if(!tmp.exists()){
                tmp.mkdirs();
            }

            outputStream = new FileOutputStream(tmp);

            bufferedInputStream = new BufferedInputStream(inputStream);

            bufferedOutputStream = new BufferedOutputStream(outputStream);

            byte[] byteArr = new byte[size];

            int len = 0;
            while ((len = bufferedInputStream.read(byteArr)) != -1) {
                bufferedOutputStream.write(byteArr, 0, len);
            }
            bufferedOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

}
时间: 2024-12-18 12:28:30

文件流之字节缓冲流(BufferedInputStream BufferedOutputStream)的相关文章

编码表、字节流、字节缓冲流

概念:     字节流不需要刷新(byte) 字符流需要刷新(char) IO流:input(通过Java程序往内存里读取) output(通过Java程序往硬盘上外写出) 输入输出流 * IO流的分类 *          按照操作的数据不同 *                 字节流:操作字节,由于计算机上一切皆是字节,字节流可以操作一切数据 *                 字符流:操作字符,只能操作文本文件 *                 文本文件:能使用文本工具 打开 看懂的叫做

字节缓冲流 ( BufferedInputStream / BufferedOutputStream)

package com.sxt.reader; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /* * 字节缓冲流 * BufferedI

java字节缓冲流和字符缓冲流

一.字节缓冲流 1.介绍 字节缓冲流根据流的方向,分为: 1.写入数据到流中,字节缓冲输出流 BufferedOutputStream 2.读取流中的数据,字节缓冲输入流 BufferedInputStream 它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度 2.字节缓冲输出流BufferedOutputStream 构造方法: public BufferedOutputStream(OutputStream out):创建一个新的缓冲输出流,以将数据写入指定的底层输

Java IO 过滤流 字节缓冲流 BufferedInput/OutputStream

Java IO 过滤流 字节缓冲流 BufferedInput/OutputStream @author ixenos 概念 BufferedInput/OutputStream是实现缓存的过滤流,他们分别是FilterInput/OutputStream的子类. BufferedInputStream工作流程 stream-->buf--read buf-->I 1.当一个BufferedInputStream被创建时,一个内部的缓冲区 byte[] buf = new byte[size]

java _io_字节缓冲流(装饰器)输入、输出

*装饰模式 字节缓冲流 BufferedInputStream bis=new BufferedInputStream(inputStream is) BufferedOutputStream bos=new BufferedOutputStream(OutputStream os) 最底层一定是节点流 只需要释放最外层的处理流,若要手动关闭遵循从里到外的顺序关闭(从字节流到处理流) 默认为8k,可以改变//参数是字节输入流对象InputStream is =new BufferedInputS

Java I/O流操作(二)---缓冲流[转]

转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的数据放进缓冲区,然后一次性把缓冲区的内容写到目的地,而不是写一次就往目的地写一次. 在这里要注意的是当我们关闭了缓冲区对象实际也关闭了与缓冲区关联的流对象. BufferWriter类 try { FileWriter fw =new FileWriter("test.txt"); //使

Java IO流之字符缓冲流

字符流: 1.加入字符缓存流,增强读取功能(readLine) 2.更高效的读取数据 BufferedReader 从字符输入流读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. FileReader:内部使用InputStreamReader,解码过程,byte->char,默认缓存大小为8k BufferReader:默认缓存大小为8k,但可以手动指定缓存大小,把数据读取到缓存中,减少每次转换过程,效率更高 //字符输入缓冲流 private static void charRead

Java核心类库-IO-包装流概述和缓冲流原理

处理流/包装流(相对于节点流更高级): 1. 隐藏了底层的节点流的差异,并对外提供了更方便的输入/输出功能,让我们之关心高级流操作. 2. 使用处理包装流包装了节点流程序直接操作处理流,让节点流与底层的设备做IO操作. 3. 只需要关闭处理流即可 包装流如何分区:写代码的时候,发现创建对象的时候,需要传递另一个流对象.new 包装流(流对象): 什么是缓冲流: 是一个包装流,目的起缓存作用. BufferedInputStream: BufferedOutputStream: BufferedR

字节缓冲流 BufferedOutputStream BufferedInputStream

/*缓冲流:读取数据大量的文件时,读取的速度慢java提供了一套缓冲流 提高io流的效率 * */ package cn.lijun.demo; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; /* * 字节输入流的缓冲流 * 继承InputStream * 构造方法 */ public class BufferedInputStre