为什么我用了缓冲流更慢了

为什么我用了缓冲流更慢了

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

public class test4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        File f1 = new File("one.txt");
        File f2 = new File("two.txt");
        try {
            f1.createNewFile();
            f2.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            FileInputStream fis1 = new FileInputStream("world.txt");
            FileInputStream fis = new FileInputStream("world.txt");
            FileOutputStream fos1 = new FileOutputStream("one.txt");
            FileOutputStream fos2 = new FileOutputStream("two.txt");
            BufferedInputStream bis = new BufferedInputStream(fis1);
            BufferedOutputStream bos = new BufferedOutputStream(fos2);
            int n = 0;
            byte[] b = new byte[1024];
            //用缓冲流
            long timestart2 = System.currentTimeMillis();
            while ((n = bis.read(b)) != -1) {
                bos.write(b, 0, n);
            }
            long timeend2 = System.currentTimeMillis();
            bos.flush();
            //不用缓冲流
            long timestart1 = System.currentTimeMillis();
            
            while ((n = fis.read(b)) != -1) {
                fos1.write(b, 0, n);
            }
            long timeend1 = System.currentTimeMillis();

            System.out.println("one不使用缓冲流来写");
            System.out.println("用时为:" + (timeend1 - timestart1));
            System.out.println("two使用缓冲流来写");
            System.out.println("用时为:" + (timeend2 - timestart2));
            System.out.println("用缓冲流来写节省了:" + ((timeend1 - timestart1) - (timeend2 - timestart2)));
            fis1.close();
            fos1.close();
            fos2.close();
            bis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
imoocLovers 2018-07-18 10:18:19

根据提议,建议同学在写入流的时候可以这样做,如下,使用FileOutputStream、BufferedOutputStream这两个流就可以了,代码会简洁明了些。

            int n = 0;
            byte[] b = new byte[100000];
            //用缓冲流
            long timestart2 = System.currentTimeMillis();
            for (int i = 0; i < 100000; i++) {
                b[i] = (byte) (1 + Math.random() * 99);
                bos.write(b[i]);
            }
            long timeend2 = System.currentTimeMillis();
            bos.flush();
            //不用缓冲流
            long timestart1 = System.currentTimeMillis();
            byte[] letter2 = new byte[100000];
            for (int i = 0; i < 100000; i++) {
                letter2[i] = (byte) (1 + Math.random() * 99);
                fos1.write(letter2[i]);
            }
            long timeend1 = System.currentTimeMillis();

祝学习愉快~


  • 提问者 L_ights #1
    我是把一个文本word.txt分别复制到one.txt和two.txt,文本原来就是有内容的,为什么我是显示不用缓存流更快
    2018-07-18 12:40:02
  • imoocLovers 回复 提问者 L_ights #2
    同学可以将byte[] b = new byte[1024];数组长度定义小一点,把world.txt文档中的内容多写一点就能看出来效果了。祝学习愉快~
    2018-07-18 13:56:51
  • 提问者 L_ights 回复 imoocLovers #3
    FileInputStream fis = new FileInputStream("world.txt"); FileInputStream fis1 = new FileInputStream("world.txt");//用同一个的时候read已经要文本末尾,无法再读 如果只有一个FileOutputStream对象 我用两次.read,第二次直接从末尾读了,然后就没东西,能不能让同一个对象的.read对一个读过的文本再从头开始读。
    2018-07-19 20:37:01
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师