0 0

经过测试没有发现IO与NIO的效率有很大的差别啊?各位帮忙分析一下5

@Test
	public void testRWbyIO() throws IOException {
		FileInputStream fins= null;
		FileOutputStream fouts = null;
		try {
		
			File f = new File("D:/httpTestData/client/io/javadoc.rar");
			fins = new FileInputStream(f);
			
			File outF = new File("D:/httpTestData/client/io/javadoc");
			fouts = new FileOutputStream(outF);
			
			byte[] bytes = new byte[1024*1024];
			while(fins.read(bytes)>0) {
				fouts.write(bytes);
			}
		}finally {
			if (fins != null) {
				fins.close();
			}
			if (fouts != null) {
				fouts.close();
			}
		}
	}
	
	@Test
	public void testRWbyNIO1() throws IOException {
		FileInputStream fins= null;
		FileOutputStream fouts = null;
		try {
		
			File f = new File("D:/httpTestData/client/nio/javadoc.rar");
			fins = new FileInputStream(f);
			FileChannel readChannel = fins.getChannel();
			
			File outF = new File("D:/httpTestData/client/nio/javadoc");
			fouts = new FileOutputStream(outF);
			FileChannel writeChannel = fouts.getChannel();
			
			ByteBuffer bb = ByteBuffer.allocate(1024*1024);
			
			while(true) {
				bb.clear();
				int i = readChannel.read(bb);
				if (i ==-1) {
					break;
				}
				
				bb.flip();
				writeChannel.write(bb);
			}
		}finally {
			if (fins != null) {
				fins.close();
			}
			if (fouts != null) {
				fouts.close();
			}
		}
	}

 测试结果:

    <testcase name="testRWbyIO"  time="34.704"/>
    <testcase name="testRWbyNIO1"  time="33.61"/>

 两个方法处理的是同一个文件的两个拷贝,文件大小28M,最终结果两个时间差不多,缓存设置有点大,所以很慢

我想问什么情况之间IO和NIO有效率的差别呢? 难道主要是阻塞和非阻塞的使用?还是说我这个测试写得不好

2010年3月24日 12:36

3个答案 按时间排序 按投票排序

0 0

采纳的答案


NIO 与传统IO的测试,我也做过。两者在普通文件的读取时,速度几乎没有差异。

更有趣的是,如果传统IO,使用的得当(比如使用BufferedInputStream、BufferedReader
),是很快的。如果NIO使用不当(比如,我用MappedByteBuffer,将文件映射到内存,Buffer的大小是文件的总长度43M),速度是传统IO的二十分之一。


引用IBM官方教程中的一句话,来解释:

引用
在 JDK 1.4 中原来的 I/O 包和 NIO 已经很好地集成了。 java.io.* 已经以 NIO 为基础重新实现了,所以现在它可以利用 NIO 的一些特性。例如, java.io.* 包中的一些类包含以块的形式读写数据的方法,这使得即使在更面向流的系统中,处理速度也会更快。


可以看到,1.4后的IO经过了集成。所以NIO的好处,集中在其他特性上,而非速度了:

1、分散与聚集读取
2、文件锁定功能
3、网络异步IO

2010年3月26日 08:02
0 0

各位看官们我来谈谈我的看法,不对的地方请指正:
首先现在的io基本上都已经与nio集成,所以你这样测试根本没有差别
NIO与传统的标准IO之间的差别在于读写数据的方式,标准io是一个字节,一个字节的读取,而nio把这些交给通道,让操作系统去批量处理这些数据。把这些繁杂的数据交给操作系统来做。传统的io是没有缓冲的概念的,所以要想测试,
传统io
  byte[] bytes = new byte[1024*1024]; 
            while(fins.read(bytes)>0) { 
                fouts.write(bytes); 
            } 
此处不应使用byte数组缓冲,而是模拟原始io方式一个一个字节读取,看两者读完所有数据的数据差。而以上这种方式,其实还是用了缓冲现在的io基本上都已经与nio集成,所以没差别
而造成这种差别来源:
1.一个字节一个字节的读取,每次read都会产生系统调用,会有状态切换,从用户态切换到内核态,然后一个一个字节的把内核缓冲区的数据搬运到用户态,这样的效率是低下的
2.而nio 则是切换一次,装载一批数据,就避免了状态的频繁切换。

其次nio还有诸多的其他方面的功能
例如:
   1.Scatter/Gather 会是一个极其强大的工具。它允许您委托操作系统来完成辛苦
活:将读取到的数据分开存放到多个存储桶(bucket)或者将不同的数据区块合并成一个整体。这
是一个巨大的成就,因为操作系统已经被高度优化来完成此类工作了。它节省了您来回移动数据的66
工作,也就避免了缓冲区拷贝和减少了您需要编写、调试的代码数量。既然您基本上通过提供数据
容器引用来组合数据,那么按照不同的组合构建多个缓冲区阵列引用,各种数据区块就可以以不同
的方式来组合了
   2.直接内存映射buffer,相当于直接在内存取数据,而不需要经过内核态的缓冲区
   3,对于scoket编程,有非阻塞io的形式,支持io多路复用,改变了传统的一个线程只能管理一个链接,现在可以一个线程管理n个链接

写了一个测试比较案例:
@Test
    public void channelTest00() {
        try {
            FileInputStream fis=new FileInputStream(new File("E:\\input-file.txt"));
//            RandomAccessFile file = new RandomAccessFile("E:\\input-file.txt", "rw");
            FileChannel channel = fis.getChannel();
            ByteBuffer header = ByteBuffer.allocate(1024);
            long date1=System.currentTimeMillis();
            int count=channel.read(header);
            while (count!=-1){
                header.flip();
                header.clear();
                count=channel.read(header);
            }
            long date2=System.currentTimeMillis();
            System.out.println(date2-date1);


            channel.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Test
    public void inputOutStreamTest() {
        File file = new File("E:\\input-file.txt");
        try {
            FileInputStream fis = new FileInputStream(file);
            long date1=System.currentTimeMillis();
            int count = fis.read();
            while(count!=-1){
                count=fis.read();
            }
            long date2=System.currentTimeMillis();
            System.out.println(date2-date1);
           fis.close();
        } catch (FileNotFoundException e) {

        } catch (IOException e) {

        }
    }

2017年9月21日 20:16
0 0

NIO相对于IO的快是指在高并发情况下

NIO是为了解决web多线程时的线程占用问题的,不是说比IO快。

2010年3月24日 12:53

相关推荐

    IO和NIO区别

    标准 IO 和 NIO 的 API 也有很大的区别。在标准 IO 中,数据是一字节一字节地读取的,而 NIO 则将数据读取到一个缓冲区中,然后再进行处理。NIO 的 API 更加复杂,需要更多的编程经验和技巧。 4. 性能和资源占用 ...

    java nio与io性能测试

    本文将深入探讨Java NIO与IO的性能测试,并通过代码实例来展示它们之间的差异。 首先,我们来看传统的Java IO模型。IO模型基于流,数据是从输入流到输出流的单向传输。例如,`FileInputStream`和`FileOutputStream`...

    高性能网络编程必备技能之IO与NIO阻塞分析

    IO与NIO的主要区别在于处理阻塞的方式。IO是面向流的,每次操作只能处理一个流,且一旦阻塞就会占用整个线程,直到操作完成。而NIO是面向缓冲区的,可以同时处理多个通道,通过Selector进行多路复用,减少了线程的...

    java io 与java nio区别

    java频道\java io 与java nio区别.txt

    Java IO_NIO

    **NIO与IO的区别** 1. 阻塞与非阻塞:Java IO是阻塞的,而NIO是非阻塞的,可以在没有数据可读时不做等待,而是继续处理其他任务。 2. 多路复用:NIO的选择器允许单线程管理多个通道,而传统的IO需要为每个连接创建一...

    NIO与传统IO代码区别实例

    总的来说,理解IO与NIO的区别,以及它们在不同场景下的优缺点,对于提升Java服务器开发的性能和效率至关重要。NIO尤其适用于需要处理大量并发连接的网络服务,如聊天服务器、游戏服务器等。希望这个简要的介绍能帮助...

    Java IO与NIO文档

    Java IO与NIO是Java平台中用于处理输入输出操作的核心技术。它们在处理数据传输、文件操作、网络通信等方面起着至关重要的作用。本篇将深入探讨这两个领域,旨在帮助开发者更好地理解和应用这些概念。 首先,Java ...

    05-Java中的IO与NIO面试题(15题)-新增.pdf

    NIO 和 IO 有相同的作用和目的,但实现方式不同,NIO 主要用到的是块,所以 NIO 的效率要比 IO 高很多。在 Java API 中提供了两套 NIO,一套是针对标准输入输出 NIO,另一套就是网络编程 NIO。 常用的 IO 类有: *...

    自己封装的IO核NIO

    Java平台提供了丰富的IO和NIO API,但它们的使用往往相对复杂,需要对底层机制有深入理解。本文将详细介绍如何封装Java IO和NIO,以及基于此封装的HTTP客户端的实现。 首先,让我们了解一下Java的IO和NIO。Java IO...

    Java IO NIO and NIO 2 无水印pdf

    Java IO NIO and NIO 2 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn...

    Java NIO与IO性能对比分析.pdf

    Java NIO与IO性能对比分析.pdf

    Java IO NIO and NIO 2 epub

    Java IO NIO and NIO 2 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    JAVA的IO与NIO

    本文将深入探讨NIO(New Input/Output)与IO的区别,以及NIO中的关键概念——Channel、Buffer以及它们如何协同工作。 知识点1:NIO与IO的区别 IO(Input/Output)是Java早期提供的输入输出模型,其核心是基于流...

    第11讲 Java提供了哪些IO方式? NIO如何实现多路复用?1

    Java平台的IO机制是软件开发中的关键组成部分,随着大数据的增长和分布式系统的普及,IO的扩展性和效率变得至关重要。Java提供了多种IO方式,包括传统的阻塞IO(BIO)、非阻塞IO(NIO)以及异步非阻塞IO(AIO,也...

    JAVA IO and NIO

    Java IO (Input/Output) 和 NIO (Non-blocking Input/Output) 是Java平台中用于处理输入和输出操作的重要部分。这两种技术在实现客户端与服务器之间的通信时起着至关重要的作用。下面将详细介绍Java IO和NIO的特点、...

    Java_NIO与IO的区别和比较.doc

    相比于传统的IO(Input/Output)模型,NIO引入了非阻塞I/O、字符转换、缓冲和通道等新特性,极大地提高了Java程序在处理I/O操作时的性能。 1. **Buffer**:在传统的IO操作中,数据通常直接在流之间传输,这可能导致...

    JavaIO和NIO练习

    Java IO(Input/Output)和NIO(New IO)是Java平台中用于处理输入和输出操作的核心库。这两个系统提供了不同的方式来读取和写入数据,分别适用于不同类型的场景和需求。 Java IO体系主要基于流(Stream)的概念,...

    Java NIO与IO的区别和比较.pdf

    Java NIO与IO的区别和比较,

    IO和NIO区别共1页.pdf.zip

    本文将深入探讨IO和NIO的区别,帮助开发者理解这两种机制的工作原理及其适用场景。 首先,我们来了解一下传统的IO模型。Java中的IO基于流(Stream)的概念,数据以字节或字符的形式从源流向目的地。IO模型是阻塞的...

    Java IO, NIO and NIO.2

    Input/output (I/O) is not a sexy subject, but it’s an important part of non-trivial applications. This book introduces you to most of Java’s I/O capabilities as of Java 8 update 51.

Global site tag (gtag.js) - Google Analytics