java FileI(O)nputStream为什么比BufferedI(O)utputStream慢?
因为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慢?的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- Java设计模式之装饰者模式
要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...
- Java新手学习路线
转自网络 分享个JAVA学习路线[新手可以参考看下]觉得不好的,大家可以提出来我补充. 第一阶段 技术名称 技术内容 J2SE(java基础部分) java开发前奏 计算机基本原理,Jav ...
- [Java开发之路](16)学习log4j日志
1. 新建一个Javaproject.导入Jar包(log4j-1.2.17.jar) Jar包下载地址:点击打开链接 2. 配置文件:创建并设置log4j.properties # 设置 log4j ...
- 文件上传之Java篇
最近做了一个下载文档的功能,于是联想到了上传功能,于是自己研究了一下后台语言是java的情况下怎样实现将文件上传到指定的目录,以下是项目的语言: 1.后台用jfinal框架 2.前台用jquery提交 ...
- Java程序设计学习笔记(三)—— IO
时间:2016-3-24 11:02 --IO流(Input/Output) IO流用来处理设备之间的数据传输. Java对数据的操作是通过流的方式. Java对于操作流的对象都在 ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
随机推荐
- Problem C: 深入浅出学算法004-求多个数的最小公倍数
Description 求n个整数的最小公倍数 Input 多组测试数据,先输入整数T表示组数 然后每行先输入1个整数n,后面输入n个整数k1 k2...kn Output 求k1 k2 ...kn的 ...
- bzoj 2770 堆的中序遍历性质
我们知道二叉搜索树的中序遍历是一个已经排好序的序列,知道序列我们无法确定树的形态(因为有多种). 但是,Treap如果告诉我们它的关键字以及权值,那么就可以唯一确定树的形态(Treap的O(logn) ...
- luoguoj 1598 垂直柱状图 模拟
P1598 垂直柱状图 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=1598 ...
- 使用 dsc_extractor 导出 dyld_shared_cache_arm64
iOS系统的全部Framework二进制被打包成一个cache文件,位于 /System/Library/Caches/com.apple.dyld 目录下,我们要想查看某个系统库的二进制需要将 dy ...
- linux基础命令学习(二)文件和目录操作
1.变换当前目录(change directory) cd /home 进入 '/ home' 目录' (change directory) cd .. 返回上一级目录 cd .. ...
- mysql存储过程导入表
运用存储过程,把用户表一数据导入用户表二 DELIMITER @@ CREATE PROCEDURE imp_to_user2() BEGIN – 声明一个标志done, 用来判断游标是否遍历完成 D ...
- 前端UED网站汇总
爱词霸UED团队 MED | 营销展现研究专家 携程UED-携程旅行前端开发团队 支付宝前端开发车间 Taobao UED Team: 淘宝网用户体验团队博客,有关用户体验设计和研究的经验分享. - ...
- SpringMvc的服务器端跳转和客户端跳转
首先,找到 package org.springframework.web.servlet.view; public class InternalResourceViewResolver extend ...
- SpringMvc(1) --Eclipse搭建web项目
http://blog.csdn.net/uucai http://blog.csdn.net/uucai/article/details/21258575
- ionic开发环境搭建之ios
前言 公司在做完ionic androud版后就开始做ios版,虽然ios的坑我觉得比起androud少了很多,但是作为第一次接触ios的我来说,环境实在太麻烦,从搭环境到打包一个正式版的ios ap ...