`
haifeng0730
  • 浏览: 2193 次
社区版块
存档分类
最新评论

NIO与I/O的区别

阅读更多

NIO与原有的I/O有同样的作用和目的,是基于原有的I/O的改进和扩展。NIO与原有的I/O不同,他是基于特殊的缓冲块进行的搞笑I/O操作。NIO的缓冲区块与普通的缓冲区不同,他是一块连续的空间,他的内存的分配不再java的

堆栈中,不受java内存的回收的影响;他的实现不是纯java代码,而是本地代码,这样操作系统,可以直接与缓冲区进行交互,java程序只需要完成对缓冲区的读写,而后续操作由操作系统完成。

使用NIO来实现对文件的复制。效率比一般的IO流快很多。在使用NIO的时候采用了缓冲刘的封装,所以效率会更高。

以下是利用NIO实现对文件的复制

 

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class CopyFile {

	/**
	 * 实现文件复制
	 * 
	 * @param srcFile
	 *            srcFile源文件
	 * @param destFile
	 *            destFile目标文件
	 * @throws IOException
	 */
	public void copy(String srcFile, String destFile) throws IOException {
		long begin = System.currentTimeMillis();
		// 创建ByteBuffer缓冲区,大小可以根据实际情况指定
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		// 获取 NIO读取通道
		FileInputStream fin = null;
		FileChannel in = null;
		// 获取NIO写入通道
		FileOutputStream fout = null;
		FileChannel out = null;

		fin = new FileInputStream(srcFile);
		in = fin.getChannel();
		fout = new FileOutputStream(destFile);
		out = fout.getChannel();
		int len = -1;
		// 当文件读到末尾时候结束循环
		while ((len = in.read(buffer)) != -1) {
			// 在write之前,将position和limit标志设置好
			buffer.flip();
			// 按照设定的position位置开始读,到limit结束
			out.write(buffer);
			// 初始化position/limit/capcity标志的位置,为下一次循环读取做准备
			buffer.clear();
		}
		long end = System.currentTimeMillis();
		// 根据前后时间之差,计算复制文件所需的时间
		System.out.println(end - begin);
		out.close();
		in.close();
		fout.close();
		fin.close();

	}

	/**
	 * Description
	 * 
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		CopyFile copyFile = new CopyFile();
		copyFile.copy(args[0], args[1]);
	}

}
 

NIO是在原有的IO的基础上进行改进,因此使用NIO来读写文件,首先还是需要使用IO流类。不是所有的IO流都支持NIO操作,支持NIO的操作的类有FileInputStream、FileOutputStream和RandomAccessFile。

 

NIO并不是对原有的I/O的替代,尽管NIO在I/O操作时速度快,但是由于其底层借助了大量的本地代码,对操作系统和硬件平台有很大的依赖性,浙江影响Java的可移植性。

 

1
0
分享到:
评论

相关推荐

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

    这两种I/O模型在处理数据传输时有着显著的区别,对程序性能和并发性有着深远的影响。 **阻塞I/O(Blocking I/O)** 阻塞I/O模型是最常见的I/O模式,在Java中主要体现在`InputStream`和`OutputStream`等基本I/O类上...

    利用JDK7的NIO2.0进行I/O读写和监视

    在Java编程领域,JDK 7引入了一个重要的更新——NIO2.0,也被称为“New I/O 2.0”或“AIO”(Asynchronous I/O)。这个更新极大地提升了Java处理I/O操作的能力,特别是在文件系统交互和网络通信方面。NIO2.0主要增加...

    Java I/O, NIO and NIO.2

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

    Java 新I/O

    NIO的核心在于通道(Channels)和缓冲区(Buffers)的概念,与传统的流(Streams)模型有着显著的区别。 1. **缓冲区(Buffers)** NIO中的核心概念是缓冲区,它允许数据在被读取或写入时存储在一个特定区域。缓冲...

    异步I/O处理

    它与同步I/O形成鲜明对比,同步I/O在执行时会阻塞调用线程,直到I/O操作完成,而异步I/O则允许程序在等待I/O操作完成时继续执行其他任务,从而提高系统的整体效率。 在传统的同步I/O模型中,当一个线程发起读取或...

    Java I/O, 2nd Edition

    这本书在第二版中对Java I/O进行了更新,涵盖了从Java 5到Java 8的最新发展,包括NIO.2(New I/O 2)框架的介绍。 1. **Java I/O基础**:书中首先介绍了Java I/O的基本概念,如流、缓冲区、字符编码和文件操作。流...

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

    Java I/O(输入/输出)系统是Java编程语言中用于处理数据流的重要组成部分,它允许程序与外部资源如文件、网络、硬件设备等进行交互。深入理解Java I/O的工作机制对于开发高效、可靠的系统至关重要。以下是对Java I/...

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O

    Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...

    Java I/O层次结构详解

    11. **NIO(非阻塞I/O)** - **java.nio包**:引入了通道(Channel)和缓冲区(Buffer)的概念,提供异步I/O操作。 - **Selector**:用于多路复用,监控多个通道的事件。 12. **工具类** - **PrintStream**:...

    Java IO, NIO and NIO.2(Apress,2015)

    Java I/O, NIO, and NIO.2 is a power-packed book that accelerates your mastery of Java's various I/O APIs. In this book, you'll learn about classic I/O APIs (File, RandomAccessFile, the stream classes ...

    java基础之I/O流

    Java中的I/O流是程序与外部数据交互的重要机制,它允许数据在程序、文件、网络等之间流动。I/O流分为两大类:字符流(Character Stream)和字节流(Byte Stream),每类又分为输入流(Input Stream)和输出流...

    Java IO与NIO:深入理解与实践指南

    Java IO和NIO提供了两种不同的I/O处理...了解这两种I/O处理方式的区别和特点,可以帮助开发者根据具体的应用需求选择合适的I/O模型。随着Java语言的发展,NIO也在不断地扩展和优化,为开发者提供了更多的选择和工具。

    nio4r, ruby的新 I/O.zip

    nio4r, ruby的新 I/O 注意:这是 2.x的稳定分支。 对于 1.x 的旧版分支,请参见: https://github.com/socketry/nio4r/tree/1-x-stable为 ruby ( nio4r ) 添

    Java I-O NIO and NIO2

    Java I/O, NIO以及NIO2是Java编程语言中处理输入输出操作的重要API集合,它们分别代表着不同的I/O处理方式和技术。 Java I/O是指传统的I/O操作,涉及经典的I/O类库,如File、RandomAccessFile以及各种流类(stream ...

    NIO学习系列:连网和异步IO

    在IT行业中,网络编程是构建分布式系统和网络应用的基础,而Java NIO(Non-blocking Input/Output)则是Java提供的一种高效、低延迟的I/O模型。本篇文章将深入探讨NIO在连网和异步IO方面的应用,以及如何通过源码...

    Java I/O系统

    Java I/O系统是Java编程语言中的一个重要组成部分,它允许程序进行输入输出操作,与外部世界进行数据交互。在Java中,I/O系统基于流的概念,流可以被视为数据的流动渠道,既可以用来读取数据(输入流),也可以写入...

Global site tag (gtag.js) - Google Analytics