`
pengcqu
  • 浏览: 774574 次
  • 性别: Icon_minigender_1
  • 来自: 未来
社区版块
存档分类
最新评论

Java中通过缓冲区提高I/O系能

阅读更多

    我们知道Java中一般的输入输出流类都是用单字节的读取方法来进行I/O操作的,也就是说每次只读写一个字节的数据,这种方法显然繁琐低效。如果从设备读取10M的文件,每次读取一个字节,完成操作将需要做10M/次I/O操作,I/O操作又是一件相当耗时的事情,无疑在很大程度上降低了系统的性能。


    Java中专门提供提高I/O效率的缓冲类,这好比在数据读写时提供一个临时缓冲区,每次读取一个缓冲区大小的数据,将这数据库一次性写入目标设备。下图中分别为两种读取方式。

 


    举个简单例子,在A地有10000本书需要搬到B地,如果一次搬1本,需要10000次。如果每次取1000本放到一个货车上,运到B地,需要10次完成。货车相当于是缓存区。同样道理,开设一个数据缓存区每次读取一数据块对于提高读取效率有显著提升。下面用一个具体代码示例来表示二者的性能差别。

 

import java.io.*;

/*******************************************************************************
 * 
 * @author pengcqu
 * 
 */
public class TestBuffer {

	public static void main(String args[]) throws IOException {
		TestBuffer br = new TestBuffer();
		String from = "d:/a/1.MP3";
		long startTime = System.currentTimeMillis();
		br.readWrite(from,"d:/b/2.MP3");
		long endTime = System.currentTimeMillis();
		System.out.println("直接读取耗时:" + (endTime - startTime) +"ms");
		long startTime1 = System.currentTimeMillis();
		br.readWriteWithBuffer(from, "d:/b/3.MP3");
		long endTime1 = System.currentTimeMillis();
		System.out.println("使用缓冲区读取耗时:" + (endTime1 - startTime1) +"ms");
		

	}

	/***************************************************************************
	 * 直接读取文件
	 * 
	 * @param from
	 * @param to
	 * @throws IOException
	 */
	public static void readWrite(String from, String to) throws IOException {
		InputStream in = null;
		OutputStream out = null;
		try {
			in = new FileInputStream(from);
			out = new FileOutputStream(to);
			while (true) {
				int data = in.read();
				if (data == -1) {
					break;
				}
				out.write(data);
			}
		} finally {
			if (in != null) {
				in.close();
			}
			if (out != null) {
				out.close();
			}
		}
	}

	/***************************************************************************
	 * 使用缓存区读写文件
	 * @param from
	 * @param to
	 * @throws IOException
	 */
	public static void readWriteWithBuffer(String from, String to)
			throws IOException {
		InputStream inBuffer = null;
		OutputStream outBuffer = null;
		try {
			inBuffer = new BufferedInputStream(new FileInputStream(from));
			outBuffer = new BufferedOutputStream(new FileOutputStream(to));
			while (true) {
				int data = inBuffer.read();
				if (data == -1) {
					break;
				}
				outBuffer.write(data);
			}
		} finally {
			if (inBuffer != null) {
				inBuffer.close();
			}
			if (outBuffer != null) {
				outBuffer.close();
			}
		}
	}

}

  

结果:对于5.8M大小的文件,直接读写耗时:39266ms;使用缓冲区读写耗时:719ms。可见通过Buffer读写文件性能的明显优于直接读写。

如有理解不妥之处,请各位高手补充意见。

 

 

 

相关链接:

★  Java知识点汇总 

 

  • 大小: 8.7 KB
3
2
分享到:
评论
2 楼 cselmu09 2014-10-31  
缺少outBuffer.flush()来刷新此缓冲的输出流。
有可能导致文件出错吧!
1 楼 对酒当歌,人生几何 2009-11-20  
不用buffer
引用
in = new FileInputStream(from);  
            out = new FileOutputStream(to);  
            while (true) {  
                int data = in.read();  
                if (data == -1) {  
                    break;  
                }  
                out.write(data);  
            }


这里,如果这样:
in = new FileInputStream(from);   
            out = new FileOutputStream(to);  
            byte[] b = new byte[1024*4]; 
            while ((int i=in.read(b)>0 ) {   
                out.write(b,0,i);   
            }


效果会如何呢? 还有,如果用buffer,缓存也是在内存呢吧?

相关推荐

    Java 新I/O

    Java 新I/O,也称为NIO(New Input/Output),是Java平台中对传统I/O模型的一种改进。在Java 1.4版本中引入的NIO库为开发人员提供了更高效、非阻塞的数据处理方式,特别适用于高并发、低延迟的系统。NIO的核心在于...

    java阻塞i/o与非阻塞i/o控制

    在Java编程环境中,I/O(输入/输出)操作是程序与外部世界交互的关键部分,包括读取文件、网络通信等。对于高效的系统设计,理解...阅读"解析Java中的阻塞I_O与非阻塞I_O控制.pdf"文件,将能进一步深化对此主题的理解。

    Java I/O, 2nd Edition

    1. **Java I/O基础**:书中首先介绍了Java I/O的基本概念,如流、缓冲区、字符编码和文件操作。流是数据传输的核心机制,分为字节流和字符流两大类,包括输入流和输出流。缓冲区则可以提高I/O操作的效率,减少磁盘和...

    利用缓冲区提高Java应用程序的IO性能

    综上所述,通过合理地运用I/O缓冲区,可以显著提高Java应用程序的I/O性能。对于需要频繁进行磁盘访问的任务,如生物信息学中的基因序列搜索,这一点尤为重要。使用Java自带的缓冲类是最简单且有效的方法,能够显著...

    Java I/O, NIO and NIO.2

    Java I/O, NIO, 和 NIO.2 是Java平台中处理输入/输出操作的核心组件,对于任何Java开发者来说,理解和掌握这些概念至关重要。本文将深入探讨这些技术,旨在提供一个全面而详尽的概述。 Java I/O(Input/Output)是...

    深入分析 Java I/O 的工作机制(转载)

    为了提高效率,Java I/O系统使用缓冲区技术。BufferedInputStream和BufferedReader是带缓冲的输入流,它们会在内部维护一个缓冲区,批量读取或写入数据,减少系统调用的次数。 4. **转换流** 转换流是连接字节流...

    Java I/O 过滤流-带格式的读写操作

    - **BufferedReader** 和 **BufferedWriter**:为了提高效率,Java提供了缓冲流,它们在内部维护了一个缓冲区,可以一次性处理大量数据,减少系统调用的次数。 4. **示例代码** - `DataTest.java`:可能包含了...

    Java I/O层次结构详解

    - **java.nio包**:引入了通道(Channel)和缓冲区(Buffer)的概念,提供异步I/O操作。 - **Selector**:用于多路复用,监控多个通道的事件。 12. **工具类** - **PrintStream**:方便地打印各种类型的数据,...

    java数据流 I/O系统

    在Java中,I/O操作是通过数据流的概念来实现的。 数据流的基本概念涉及数据的流动方向和组织层次。数据流可以分为输入数据流和输出数据流,前者只能读取数据,后者只能写入数据。在Java中,`java.io`包提供了这些...

    Java I/O流通讯录

    3. `BufferedReader` 和 `PrintWriter`:这两个是字符流,提供了缓冲区功能,提高读写效率。`BufferedReader` 用于从输入流读取字符数据,而 `PrintWriter` 用于向输出流写入字符数据,通常用于控制台输出。 4. `...

    Java I/O总结

    3. **流的缓冲**:为了提高性能,经常会在基本流之上使用缓冲流(BufferedInputStream/BufferedOutputStream, BufferedReader/BufferedWriter),这些流内部维护了一个缓冲区,可以显著减少对底层设备的访问次数。...

    Java中的缓冲区(直接缓冲区、非直接缓冲区等).docx

    总结来说,Java中的缓冲区是提高I/O性能的关键工具,它们通过提供高效的内存管理和数据传输机制,适应了不同的I/O需求。了解并熟练运用缓冲区,可以显著优化Java程序的性能,尤其是在处理大量数据时。

    MaglevIO,一个易于使用和高效的Java I/O库。基于Java NATEVEIO。.zip

    相反,NIO采用通道(Channels)和缓冲区(Buffers)的概念,实现了非阻塞I/O,允许单个线程同时处理多个连接,从而提高了系统资源利用率和并发能力。 **MaglevIO的特点** 1. **易用性**:MaglevIO通过提供简洁的...

    Java文件File的使用及I/O的使用

    除了基本的文件操作,Java还支持更高级的I/O特性,如NIO(非阻塞I/O)、通道、缓冲区等,这些在处理大量数据和高并发场景下非常有用。 在课程安排中提到的其他技术,如序列化、XML、线程、设计模式、反射机制、...

    Java I/O 使用和最佳实践

    为了提高效率,Java提供了带缓冲的流,如`BufferedInputStream`和`BufferedOutputStream`,它们在内部维护一个数据缓冲区,减少对底层资源的频繁访问。同样,`BufferedReader`和`BufferedWriter`在处理字符流时也有...

    NIO与I/O的区别

    标题“NIO与I/O的区别”涉及到的是Java编程中关于输入/输出(I/O)模型与新I/O(New I/O,NIO)模型的对比。这两种模型在处理数据流时有不同的特性和适用场景,理解它们的区别对于优化Java程序的性能至关重要。 I/O...

    Java课程设计报告书-学生版-1_I/O流与文件课程设计_

    本课程设计报告书——“Java课程设计报告书-学生版-1_I/O流与文件课程设计_”旨在帮助学生深入理解并掌握如何在Java中进行文件操作,通过实际的实验案例来学习文件对象和流类的应用。 一、Java I/O流概述 Java的I/O...

    Java文件输入输出(I/O)流.pdf

    Java文件输入输出(I/O)流是Java编程语言中用于处理数据传输的核心概念,主要涉及对文件的读写操作。Java I/O系统是基于流(Stream)的概念构建的,流可以被视为数据的有序序列,既可以是从内存到硬盘的写入,也...

Global site tag (gtag.js) - Google Analytics