通过系统缓冲流类提高I/O操作

Java语言中一般的输入与输出流类,都是采用单字节的读取方法,进行数据I/O操作的。也就是每次只读取或写入一个字节的数据,这种方法显然繁琐而低效。其读取与写入的流程图,如图1所示:

打个比方:

假设在A地有100本图书,需要把这些图书从A地运送到B地。

如果每次从A地只拿一本图书到B地,则需要往返A、B两地100次;

如果每次从A地取10本图书到B地,则只需要10次就可以完成这个任务。

显然,后者的效率要高。这个故事中的“每次拿10本”相当于I/O操作的“缓冲区”。

开设一个数据缓冲区来每次读取一个数据块,提高系统性能,这在网络数据传输中显得尤其重要。采用数据缓冲类读取与写入的流程图,如图2所示:

案例如下:

package cn.optimize.len;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ReadWriteWithBuffer {

	public static void main(String[] args) {
		ReadWriteWithBuffer rw = new ReadWriteWithBuffer();
		try{
			long startTime = System.currentTimeMillis();
			rw.readWrite("D:/temp/uwp.txt","D:/temp/uwp2.txt");
			long endTime = System.currentTimeMillis();
			System.out.println("直接读取与写入耗时:"+(endTime-startTime)+"ms");

			startTime = System.currentTimeMillis();
			rw.readWriteBuffer("D:/temp/uwp.txt","D:/temp/uwp3.txt");
			endTime = System.currentTimeMillis();
			System.out.println("通过系统缓冲区读取与写入时:"+(endTime-startTime)+"ms");
		}catch(IOException e){
			e.printStackTrace();
		}
	}

	/**
	 * 直接通过文件输入/输出来读取与写入
	 * @param fileFrom 源文件
	 * @param fileTo 目的文件
	 * @throws IOException
	 */
	public static void readWrite(String fileFrom,String fileTo)throws IOException{
		InputStream in = null;
		OutputStream out = null;
		try{
			in = new FileInputStream(fileFrom);
			out = new FileOutputStream(fileTo);
			while(true){
				int bytedata = in.read();
				if(bytedata==-1)
					break;
				out.write(bytedata);
			}
		}finally{
			if(in != null)
				in.close();
			if(out != null)
				out.close();
		}
	}

	/**
	 *通过系统缓冲区来读取与写入
	 * @param fileFrom 源文件
	 * @param fileTo 目的文件
	 * @throws IOException
	 */
	public static void readWriteBuffer(String fileFrom,String fileTo)throws IOException{
		InputStream inBuffer = null;
		OutputStream outBuffer = null;
		try{
			InputStream in = new FileInputStream(fileFrom);
			inBuffer = new BufferedInputStream(in);
			OutputStream out = new FileOutputStream(fileTo);
			outBuffer = new BufferedOutputStream(out);
			while(true){
				int bytedata = inBuffer.read();
				if(bytedata==-1)
					break;
				out.write(bytedata);
			}
		}finally{
			if(inBuffer != null)
				inBuffer.close();
			if(outBuffer != null)
				outBuffer.close();
		}
	}

}

在上面的例子中,读取D:/temp/uwp.txt文件,该文件是一个221KB的文本文件,然后将读取的内容写入到另一文件中,并采用两种不同的方式:

1)直接读取与写入

2)采用系统输入输出缓冲类读取与写入

编译上述文件,其输出的信息如下:

可知,如果文件较大时,建议采用系统缓冲类,来进行文件的读取与写入操作。

通过系统缓冲流类提高I/O操作

时间: 2024-11-04 14:25:08

通过系统缓冲流类提高I/O操作的相关文章

【Java】缓冲流如何提高性能

前言 本文写的粗糙,仅作于工作间隙的随笔. 传统的Java IO是基于阻塞的,他的工作状态就是"读/写,等待,读/写,等待······". 缓冲流有字节和字符两种,原理上几乎差不读,本处以字节缓冲路来进行讨论. 一.缓冲输入流 BufferedInputStream extends FileInputStream,缓冲流的设计思想是基于装饰器设计模式的,需要在构造缓冲流的时候传入一个节点流. 缓冲输入流为什么能够提高效率? 简单一句话就是空间换时间.read方法虽然是一个字节一个字节的

Java IO之处理流(缓冲流、转换流)

一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性). 三.缓冲流 1.字节缓冲流 BufferedInputStream BufferedOutputStream package IOBuffer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im

字节缓冲流 BufferedOutputStream BufferedInputStream

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

Java学习总结(7)——(File类,IO流,(缓冲流,转换流等),Properties类)

一.File类 java.io.File类代表系统文件(文件和目录) 访问文件属性步骤 (1)创建文件对象 格式:File file=new File(String pathname); (2)调用方法:操作文件目录的属性(路径,权限,日期和时间等) File类的属性(separator默认名称分隔符) (1)在UNIX系统上,此字段的值为 '/ ';在window系统上,它为'\' (2)为了程序的跨平台性,文件的路径应该用这个属性值来代表 File类的常用方法 方法名称 说明 Boolean

JavaSE_12_Properties类和缓冲流

1.Properties类 java.util.Properties 继承于Hashtable ,来表示一个持久的属性集.它使用键值结构存储数据,每个键及其对应值都是一个字符串.该类也被许多Java类使用,比如获取系统属性 时,System.getProperties 方法就是返回一个Properties对象. 构造方法 public Properties() :创建一个空的属性列表. 基本的存储方法 public Object setProperty(String key, String va

BufferedStream类 - 缓冲流

BufferedStream常用于对其他流的一个封装,它必须和其他流结合一起使用.MemoryStream将所有的内容都放入内存中,而BufferedStream不是.BufferedStream在基础流写入内存中能够提高读取与写入速度.但是缓冲区设置的大小对性能也有影响,默认值是4096字节,并能够根据需求自动增长.并且很多属性都与基础流一致.缓冲数据能够减少对操作系统的调用次数,缓冲数据主要存储在缓冲区中,缓冲区是内存中的字节块.BufferedStream类提供从基础数据源或存储库读取字节

字符缓冲流,properties类,序列化流与反序列化流,打印流

1.字符缓冲流的写法与字节缓冲流类似,也是用字符缓冲对象嵌套字符读写对象.格式为: BufferedReader br=new BufferedReader(new FileReader(数据源)): BufferedWriter bw=new BufferedWriter(new FileWriter(目的地)): 2.BufferedReader有一个优势是可以读取一个文本行,它的方法是readLine(),这与FileReader相区别. 3.在IO操作时选用哪个对象,要看输入还是输出,文

Java转换流、缓冲流、流的操作规律和properties类整理

转换流 1.1                OutputStreamWriter类 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节.它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去. package com.oracle.reader; public class Demo04 { public static void main(String[] args) throws IOException

重要的几种流:文件流、缓冲流、转换流!

一.文件流(字节流,字符流) 1.字节流 package com.zijie; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class TestFileInputStream { public static void main(String[] args) { int b = 0; FileInputStream in = null