几种不同的字节输入输出流的效率

使用字节流的几种方式
FileInputstream(FileOutputStream),
DataInputStream(DataOutputStream),
BufferInputStream(BufferOutputStream).
每一种方法都有各自的适用情况。

如果写一个小程序吧一个文件的内容copy到另一个文件,把copy这件事当成把一个水缸的谁转移到另一个水缸,
FileOutputStream —>write():一滴一滴把水转过去;
DataOutputStream—>write():一瓢一瓢把水舀过去;
BufferOutputStream—>write():把水装到水桶,一桶一桶的把水运过去。

FileOutputStream —>write()一次只能写一个字节。
DataOutputStream—>write()他的write方法有writeInt(),writeDouble(),writeUTF()等等,其实是对FileOutputStream的write方法的封装,一次能写几个字节,使得他可以直接操作基本的数据类型。
BufferOutputStream—>write()把数据先写到缓冲区中,flush()后再写到目的地。

一个一个字节复制:

    public static void copyFile(File srcFile,File copyFile) throws IOException{
        if (!srcFile.exists()) {
            throw new IllegalArgumentException("文件"+srcFile+"不存在");
        }
        if (!srcFile.isFile()) {
            throw new IllegalArgumentException(srcFile+"不是文件");
        }
        FileInputStream in = new FileInputStream(srcFile);
        FileOutputStream out = new FileOutputStream(copyFile);

        int b = 0;
        while ((b = in.read())!=-1) {
            out.write(buf, 0, b);
            out.flush();//可有可无,如果是buffoutputstream就一定要有。
        }
        in.close();
        out.close();

    }

用时两万多毫秒!不适宜用来读取大文件,通常读一些较小的配置文件吧!

一瓢一瓢舀:

    public static void copyFile(File srcFile,File copyFile) throws IOException{
        if (!srcFile.exists()) {
            throw new IllegalArgumentException("文件"+srcFile+"不存在");
        }
        if (!srcFile.isFile()) {
            throw new IllegalArgumentException(srcFile+"不是文件");
        }
        FileInputStream in = new FileInputStream(srcFile);
        FileOutputStream out = new FileOutputStream(copyFile);

        byte[] buf = new byte[8*1024];//只是加了这一句,把读到的先放在字节数组,然后在一次性写到目的地。
        int b = 0;
        while ((b = in.read())!=-1) {
            out.write(buf, 0, b);
            out.flush();
        }
        in.close();
        out.close();

    }

用时7毫秒,效率高,可以用来写下载程序

一桶一桶运:

public static void copyFileByBuffer(File srcFile,File copyFile) throws IOException{
        if (!srcFile.exists()) {
            throw new IllegalArgumentException("文件"+srcFile+"不存在");
        }
        if (!srcFile.isFile()) {
            throw new IllegalArgumentException(srcFile+"不是文件");
        }
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile));
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(copyFile));
        int x = 0;
        while ((x = bis.read())!=-1) {
            bos.write(x);
            bos.flush();

        }
        bis.close();
        bos.close();
    }

用时一万多毫秒,比第一个稍快,

你可能感兴趣的:(java,博客)