`
shyboy0358
  • 浏览: 35608 次
文章分类
社区版块
存档分类
最新评论

nio的简单用法总结

 
阅读更多
   新的输入/输出(NIO)库是在JDK 1.4中引入的。它与原来的I/O库最重要的区别是数据打包和传输的方式的不同,原来的 I/O 以流 的方式处理数据,而 NIO 以块 的方式处理数据。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。

(1)通道
     Channel是对原I/O包中的流的模拟,可以通过它读取和写入数据。拿NIO与原来的I/O做个比较,通道就像是流。
   通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类), 而通道可以用于读、写或者同时用于读写。
     因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在UNIX模型中,底层操作系统通道是双向的。

(2)缓冲区
       在NIO库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问NIO中的数据,您都是将它放到缓冲区中。
   缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
   最常用的缓冲区类型是ByteBuffer。 一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。
   ByteBuffer不是NIO中唯一的缓冲区类型。事实上,对于每一种基本Java类型都有一种缓冲区类型:
   ByteBuffer
    CharBuffer
    ShortBuffer

   IntBuffer
    LongBuffer
    FloatBuffer
    DoubleBuffer
    每一个Buffer类都是Buffer接口的一个实例。 
文件的读写

nio读取文件涉及三个步骤:
   (1) 从FileInputStream获取Channel。
   (2) 创建Buffer。
   (3) 将数据从Channel读到Buffer 中。

文件的写操作与读操作类似。

下面我以文件的拷贝为例,展示一下nio的读写过程:

import java.io.FileInputStream;
 2import java.io.FileNotFoundException;
 3import java.io.FileOutputStream;
 4import java.io.IOException;
 5import java.nio.ByteBuffer;
 6import java.nio.channels.FileChannel;
 7
 8/**
 9 * 将一个文件的所有内容拷贝到另一个文件中。
10 * 
11 * 基本步骤:
12 * 1.得到输入输出通道,创建缓冲区
13 * 2.从源文件中将数据读到这个缓冲区中,然后将缓冲区写入目标文件.此过程需不断循环直到源文件结束
14 * 
15 * @author greatjone
16 */
17public class CopyFile {
18    public static void copy(String file,String copyfile) throws IOException{
19         // 获取源文件和目标文件的输入输出流
20        FileInputStream fin = new FileInputStream(file);
21        FileOutputStream fout = new FileOutputStream(copyfile);
22
23        // 获取输入输出通道
24        FileChannel fcin = fin.getChannel();
25        FileChannel fcout = fout.getChannel();
26
27        // 创建缓冲区
28        ByteBuffer buffer = ByteBuffer.allocate(1024);
29
30        while (true) {
31            // clear方法重设缓冲区,使它可以接受读入的数据
32            buffer.clear();
33
34            // 从输入通道中将数据读到缓冲区
35            int r = fcin.read(buffer);
36
37            // read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1
38            if (r == -1) {
39                break;
40            }
41            
42            // flip方法让缓冲区可以将新读入的数据写入另一个通道
43            buffer.flip();
44
45            // 从输出通道中将数据写入缓冲区
46            fcout.write(buffer);
47        }
48    }
49}
50
分享到:
评论

相关推荐

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

    ### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...

    NIO学习与总结

    以下通过一个简单的例子来展示如何使用NIO读取文件: ```java import java.io.File; import java.io.FileInputStream; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ...

    浅谈java中nio的使用方式

    以下是一个简单的NIO服务器示例,展示了如何使用Selector、Channel和Buffer处理客户端连接: ```java public class Server { private Selector selector; private ServerSocketChannel serverSocketChannel; ...

    java nio 写文件

    要使用NIO写文件,首先需要获取FileChannel对象,这可以通过`FileOutputStream`的`getChannel()`方法实现。 2. **缓冲区(Buffers)** 缓冲区是NIO的核心组件,它是数据在通道间传输的容器。Java NIO提供了几种...

    nio 服务器/客户端模式

    总结一下,NIO服务器/客户端模式通过通道、缓冲区和选择器实现了非阻塞的I/O通信,有效提升了服务器处理并发连接的能力。理解并熟练掌握这些概念和实践,是成为一名优秀的Java网络编程开发者的关键。在实际开发中,...

    NIO复制文件

    在文件复制中,我们通常使用`transferTo()`和`transferFrom()`方法。 2. **ByteBuffer**:`java.nio.ByteBuffer`是NIO中最重要的缓冲区类型,它可以被映射到文件,也可以作为网络I/O的数据容器。在复制文件时,我们...

    NIO trick and trap .pdf

    - **HeapByteBuffer**:在JVM堆上分配空间,使用简单但效率较低。 - **DirectByteBuffer**:直接在本机内存中分配空间,避免了JVM堆和本地内存之间的数据复制,提高了效率,但创建成本较高。 - **属性**:每个缓冲...

    java-nio.rar_java nio_nio 对象实例化

    总结来说,这个压缩包的内容可能涵盖了如何在Java NIO中实例化和使用通道、缓冲区、选择器,以及如何实现一个简单的多线程服务器,利用选择器来监听和处理来自多个客户端的非阻塞I/O请求。这些内容对于理解和使用...

    Pro Java 7 NIO2

    例如,如果有一个基础路径`/usr/local/bin`,可以使用`resolve()`方法来添加相对路径: ```java Path basePath = Paths.get("/usr/local/bin"); Path relativePath = Paths.get("java"); Path resolvedPath = ...

    java io 与java nio区别

    在深入探讨Java IO与Java NIO之间的区别之前,我们先简单回顾一下这两种I/O模型的基本概念。 #### 1. Java IO(Blocking IO) Java IO,也称为传统的阻塞式IO或同步阻塞式IO,是Java早期版本中的主要I/O处理方式。...

    java网络编程NIO视频教程

    Java NIO-FileLock-介绍和使用方法 - **主要内容**:解释FileLock(文件锁)的作用及使用方法。 - **学习目标**:掌握文件锁的实现。 #### 29. Java NIO-FileLock-示例代码 - **主要内容**:提供使用FileLock的...

    mina框架--MINA框架是对java的NIO包的一个封装

    总结来说,MINA框架提供了NIO的高级抽象,使得开发者可以通过简单的API实现复杂网络服务,同时保持高性能和可扩展性。通过使用过滤器链和自定义处理器,MINA允许开发者以模块化的方式处理网络通信,从而专注于业务...

    nio学习文档及代码

    `nio-src.rar`文件中可能包含了一些NIO的示例代码,包括如何创建和操作通道、缓冲区以及选择器的实例,通过阅读和运行这些代码,可以帮助开发者深入理解NIO的工作原理和使用方法。 **8. 学习路径** 学习NIO,首先应...

    Java NIO框架Netty教程.pdf

    通过本教程,我们不仅了解了Netty的基础概念,还通过实际代码示例学习了如何使用Netty构建一个简单的服务器和客户端应用程序。这对于理解Netty的工作原理和如何在实际项目中应用Netty都是非常有帮助的。

    java nio.doc

    以下是一个简单的文件复制示例,使用 NIO 的 `FileChannel`: ```java public static void copyFileUsingNIO(String src, String dest) throws Exception { FileInputStream srcStream = new FileInputStream(src)...

    NIO socket编程小例子 加法服务器

    总结来说,"NIO socket编程小例子 加法服务器"是一个很好的学习NIO网络编程的起点。通过这个实例,我们可以了解NIO Channel、Buffer和Selector的基本用法,以及如何构建一个简单的网络通信应用。对于任何想要提升...

    使用Java NIO编写高性能的服务器.doc

    总结来说,Java NIO提供了一种高效处理并发连接的方式,通过非阻塞I/O和反应器模式,服务器可以在一个或少量线程中处理大量并发请求,显著提升了性能。然而,正确使用NIO也需要关注潜在的问题,如CPU占用率过高和...

    JAVA IO-NIO 详解

    传统IO适用于简单且低并发的场景,而NIO则更适合高并发、高性能的应用。通过深入理解Channel、Buffer和Selector等核心组件的工作原理,开发者可以更好地利用NIO来提高程序的性能和灵活性。同时,对于文件编码和字符...

Global site tag (gtag.js) - Google Analytics