`

Java NIO核心概念及基本读写

    博客分类:
  • Java
阅读更多
1.    引言
   I/O流或者输入/输出流指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。新的输入/输出(NIO)库是在JDK 1.4中引入的。NIO弥补了原来的I/O的不足,它在标准Java代码中提供了高速的、面向块的I/O。
   原来的I/O库与NIO最重要的区别是数据打包和传输的方式的不同,原来的 I/O 以流 的方式处理数据,而 NIO 以块 的方式处理数据。
   面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的I/O通常相当慢。
   NIO与原来的I/O有同样的作用和目的,但是它使用块I/O的处理方式。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。

/** 
 * 使用IO读取指定文件的前1024个字节的内容。 
 * @param file 指定文件名称。 
 * @throws java.io.IOException IO异常。 
 */  
public void ioRead(String file) throws IOException {  
    FileInputStream in = new FileInputStream(file);  
    byte[] b = new byte[1024];  
    in.read(b);  
    System.out.println(new String(b));  
}  
  
/** 
 * 使用NIO读取指定文件的前1024个字节的内容。 
 * @param file 指定文件名称。 
 * @throws java.io.IOException IO异常。 
 */  
public void nioRead(String file) throws IOException {  
    FileInputStream in = new FileInputStream(file);  
    FileChannel channel = in.getChannel();  
  
    ByteBuffer buffer = ByteBuffer.allocate(1024);  
    channel.read(buffer);  
    byte[] b = buffer.array();  
    System.out.println(new String(b));  
}  


3.    核心概念:通道和缓冲区

   1)    概述:
   通道和缓冲区是NIO中的核心对象,几乎在每一个I/O操作中都要使用它们。
   通道Channel是对原I/O包中的流的模拟。到任何目的地(或来自任何地方)的所有数据都必须通过一个Channel对象。
   缓冲区Buffer实质上是一个容器对象。发送给一个通道的所有对象都必须首先放到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。

2)    缓冲区:
   Buffer是一个容器对象,它包含一些要写入或者刚读出的数据。在NIO中加入Buffer对象,体现了新库与原I/O的一个重要区别。在面向流的I/O中,您将数据直接写入或者将数据直接读到Stream对象中。
   在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NIO中的数据,您都是将它放到缓冲区中。
   缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
   最常用的缓冲区类型是ByteBuffer。 一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。
   ByteBuffer不是NIO中唯一的缓冲区类型。事实上,对于每一种基本Java类型都有一种缓冲区类型:
   ByteBuffer
   CharBuffer
   ShortBuffer
   IntBuffer
   LongBuffer
   FloatBuffer
   DoubleBuffer
   每一个Buffer类都是Buffer接口的一个实例。 除了ByteBuffer, 每一个Buffer类都有完全一样的操作,只是它们所处理的数据类型不一样。因为大多数标准I/O操作都使用ByteBuffer,所以它具有所有共享的缓冲区操作以及一些特有的操作。
   下面的UseFloatBuffer列举了使用类型化的缓冲区FloatBuffer的一个应用例子:
public class UseFloatBuffer {

	@Test
	public void UserFloatBufferTest() {
		// 分配一个容量为10的新的 float 缓冲区  
        FloatBuffer buffer = FloatBuffer.allocate(10);  
        for (int i = 0; i < buffer.capacity(); i++) {  
            float f = (float) Math.sin((((float) i) / 10) * (2 * Math.PI));  
            buffer.put(f);  
        }  
        // 反转此缓冲区  
        buffer.flip();  
  
        // 告知在当前位置和限制之间是否有元素  
        while (buffer.hasRemaining()) {  
            float f = buffer.get();  
            System.out.println(f);  
        }  
	}
}


4.    从理论到实践:NIO中的读和写
public class CopyFile {

	@Test
	public void copyFileTest() throws IOException {
		String infile = "g:\\copy.sql";
		String outfile = "g:\\copy.txt";

		// 获取源文件和目标文件的输入输出流
		FileInputStream fin = new FileInputStream(infile);
		FileOutputStream fout = new FileOutputStream(outfile);

		// 获取输入输出通道
		FileChannel fcin = fin.getChannel();
		FileChannel fcout = fout.getChannel();

		// 创建缓冲区
		ByteBuffer buffer = ByteBuffer.allocate(1024);

		while (true) {
			// clear方法重设缓冲区,使它可以接受读入的数据
			buffer.clear();

			// 从输入通道中将数据读到缓冲区
			int r = fcin.read(buffer);

			// read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1
			if (r == -1) {
				break;
			}

			// flip方法让缓冲区可以将新读入的数据写入另一个通道
			buffer.flip();

			// 从输出通道中将数据写入缓冲区
			fcout.write(buffer);
		}

	}

}


参考:http://zhangshixi.iteye.com/blog/679959
分享到:
评论

相关推荐

    NIO学习系列:核心概念及基本读写

    ### NIO核心概念 1. **通道(Channel)**:通道是NIO中的关键组件,它连接到I/O设备(如文件、网络套接字等)。通道可以读取或写入数据,且是双向的。例如,`FileChannel`用于文件操作,`SocketChannel`用于网络...

    java NIO.zip

    通道是NIO中的核心概念之一,它提供了从一个数据源(如文件、套接字)到另一个数据源的数据传输路径。Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道...

    Java NIO英文高清原版

    NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的详细解释: 1. **通道(Channel)**:在NIO中,数据是通过通道进行传输的。通道是一种连接到I/O设备(如文件、套...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/...以上就是Java NIO的基本概念和工作流程,以及结合文件名推测的`NIOServer.java`和`NIOClient.java`可能实现的功能。学习和理解NIO,对于开发高并发、高性能的Java应用至关重要。

    Java NIO详解及源码下载

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,全称为Non-blocking Input/Output,它提供了一...通过实践和理解这些核心概念,你可以掌握如何在Java程序中有效地利用NIO进行I/O操作,提高程序的效率和可扩展性。

    一个java NIO的例子

    3. **选择器(Selector)**:选择器是Java NIO的核心,它可以监视多个通道的事件(如连接就绪、数据到达等)。通过注册感兴趣的事件类型到选择器,一个线程可以轮询选择器,找出已经准备好的通道并进行处理,避免了...

    java nio入门学习,两个pdf

    二、Java NIO核心组件 1. **通道(Channels)**:通道是数据传输的双向路径,可以用于读取和写入数据。Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、套接字和...

    Java NIO 中英文版

    通过阅读《Java NIO》这本书,无论是中文版还是英文版,读者都能深入理解这一核心概念,并将其应用于实际项目中,提升系统的性能。书中的书签功能可以帮助读者快速定位和回顾关键知识点,方便学习和查阅。

    JAVA NIO学习网站

    在Java传统IO中,数据的读写都是通过流来完成,而NIO则引入了通道(Channel)和缓冲区(Buffer)的概念,提供了一种非阻塞的I/O操作方式,极大地提高了Java进行并发I/O处理的能力。 首先,我们来看下NIO的核心组件...

    java nio 读文件

    一、NIO的基本概念 1. 缓冲区(Buffer):NIO的核心组件,用于存储数据。Java提供了多种Buffer类,如ByteBuffer、CharBuffer、IntBuffer等,分别对应不同数据类型。每个Buffer都有特定的方法用于写入、读取、清理和...

    Java语言基础教程-Java NIO流篇2

    Java NIO(New IO)是Java 1.4版本引入的一个新模块,是对传统IO模型的补充和扩展...通过本教程的学习,开发者不仅可以掌握NIO的基本概念,还能了解其在实际开发中的应用,为编写高效、灵活的Java程序打下坚实的基础。

    java nio im(server+client)

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4...通过深入理解并实践这个示例,开发者可以更好地掌握Java NIO的核心概念和技术,并将其应用于实际项目中,提升系统的性能和可扩展性。

    Java NIO系列教程(一) Java NIO 概述

    ### Java NIO 系列教程(一):Java NIO 概述 ...通过本文的学习,相信您已经对Java NIO的核心概念有了初步的了解。在未来的学习过程中,继续深入理解这些概念将有助于您更好地掌握Java NIO技术。

Global site tag (gtag.js) - Google Analytics