因为buffered多了一个缓冲区,读和写都是先把硬盘或者内存中的数据放到内存中一块缓存区域,到一定大小读写到硬盘或者内存

 

package io;

import java.io.*;

public class FileIOTest {

    /**
     * @param args
     * @throws FileNotFoundException
     */
    public static void main(String[] args) throws Exception {

        //有buff的File***Stream
        System.out.println("有buff的File***Stream耗时:");
        new TimeTest() {
            void run()throws Exception{
                FileInputStream fis = new FileInputStream("F:\\Test\\file.zip");

                FileOutputStream fos = new FileOutputStream("F:\\Test\\file1.zip");

                byte[] buf = new byte[1024];

                int length = 0;

                while ((length = fis.read(buf)) > 0) {
                    fos.write(buf, 0, length);
                }

                fis.close();
                fos.close();

            }
        }.getTime();
       
        //有buff的Buffered***Stream
        System.out.println("有buff的Buffered***Stream耗时:");
        new TimeTest() {
            void run()throws Exception{

                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:\\Test\\file.zip"));

                BufferedOutputStream bos = new BufferedOutputStream(
                        new FileOutputStream("F:\\Test\\file2.zip"));
               
                byte[] buf = new byte[1024];

                int length = 0;
               
                while ((length = bis.read(buf)) > 0) {
                    bos.write(buf, 0, length);
                }

                bis.close();
                bos.close();
               
            }
        }.getTime();
       
        //无buff的File***Stream
        System.out.println("无buff的File***Stream耗时:");
        new TimeTest() {
            void run()throws Exception{
                FileInputStream fis = new FileInputStream("F:\\Test\\file.zip");

                FileOutputStream fos = new FileOutputStream("F:\\Test\\file3.zip");

                int data = 0;

                while ((data = fis.read()) !=-1) {
                    fos.write(data);
                }

                fis.close();
                fos.close();
            }
        }.getTime();
       
        //无buff的Buffered***Stream
        System.out.println("无buff的Buffered***Stream耗时:");
        new TimeTest() {
            void run()throws Exception{
                BufferedInputStream bis = new BufferedInputStream(new FileInputStream("F:\\Test\\file.zip"));

                BufferedOutputStream bos = new BufferedOutputStream(
                        new FileOutputStream("F:\\Test\\file4.zip"));
               
                int data = 0;
               
                int i =bis.available();
               
                while ((data = bis.read()) !=-1) {
                    bos.write((byte)data);
                }

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

}

//抽象的不太好的模板设计模式
abstract class TimeTest {

    void getTime() {
        long start = System.currentTimeMillis();
        try {
            run();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    abstract void run() throws Exception;
}

 

 

测试数据248kb

 

测试结果:

 

有buff的File***Stream耗时:
8
有buff的Buffered***Stream耗时:
2
无buff的File***Stream耗时:
1369
无buff的Buffered***Stream耗时:
14

java FileI(O)nputStream为什么比BufferedI(O)utputStream慢?的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. Java设计模式之装饰者模式

    要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...

  3. Java新手学习路线

      转自网络     分享个JAVA学习路线[新手可以参考看下]觉得不好的,大家可以提出来我补充. 第一阶段 技术名称 技术内容 J2SE(java基础部分) java开发前奏 计算机基本原理,Jav ...

  4. [Java开发之路](16)学习log4j日志

    1. 新建一个Javaproject.导入Jar包(log4j-1.2.17.jar) Jar包下载地址:点击打开链接 2. 配置文件:创建并设置log4j.properties # 设置 log4j ...

  5. 文件上传之Java篇

    最近做了一个下载文档的功能,于是联想到了上传功能,于是自己研究了一下后台语言是java的情况下怎样实现将文件上传到指定的目录,以下是项目的语言: 1.后台用jfinal框架 2.前台用jquery提交 ...

  6. Java程序设计学习笔记(三)—— IO

    时间:2016-3-24 11:02 --IO流(Input/Output)     IO流用来处理设备之间的数据传输.    Java对数据的操作是通过流的方式.    Java对于操作流的对象都在 ...

  7. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  8. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  9. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

随机推荐

  1. hihocoder 1522 : F1 Score

    题目链接   时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和他的小伙伴们一起写了很多代码.时间一久有些代码究竟是不是自己写的,小Hi也分辨不出来了. 于是他实现 ...

  2. android ORM 框架 search

    1. ORMLite 特性: 通过在类上添加注解设置类 强大抽象DAO类 QueryBuilder 可以灵活的构造简单和复杂的查询语句 支持MySQL, Postgres, Microsoft SQL ...

  3. Java解读内存,优化编程

    1.别用new Boolean 在很多场景中Boolean类型是必须的,比如JDBC中boolean类型的set与get都是通过Boolean封装传递的,大部分ORM也是用Boolean来封装bool ...

  4. Digital Adjustment of DC-DC Converter Output Voltage 电阻选择

  5. picker.js源码

    /** * LArea移动端城市选择控件 * * version:1.7.2 * * author:黄磊 * * git:https://github.com/xfhxbb/LArea * * Cop ...

  6. Linux进程间通信—套接字

    六.套接字(socket) socket也是一种进程间的通信机制,不过它与其他通信方式主要的区别是:它可以实现不同主机间的进程通信.一个套接口可以看做是进程间通信的端点(endpoint),每个套接口 ...

  7. linux有用技巧:使用ntfs-3g挂载ntfs设备

    1.几种文件系统的比較 (1)在linux系统中支持一下文件系统:               Ext2         第二扩展文件系统(简称 ext2 或者 ext2) 非常多年前就已经成为 GN ...

  8. C++数组参数应用方式探讨(转)

    对于经验丰富的编程人员来说,C++编程语言应该是他们经常使用于程序开发的一种实用性语言.那么,在C++中,C++数组参数永远不会按值传递.它是传递第一个元素(准确地说是第0个)的指针. 例如,如下声明 ...

  9. 设计模式实例(Lua)笔记之四(Builder 模式)

    1.描写叙述:      又是一个周三,快要下班了,老大突然又拉住我,喜滋滋的告诉我"牛叉公司非常惬意我们做的模型,又签订了一个合同,把奔驰.宝马的车辆模型都交给我我们公司制作了,只是这次又 ...

  10. iis服务器站点配置

    iis网站正常移动到一个新的服务器上 需要配置如下: 启用父路径 不启用父路径会报服务器500错误