Java NIO学习

Java NIO学习

  1. 为什么要使用New IO?
    NIO是jdk1.4加入的新包,NIO的创建目的是为了让java程序员可以实现高速I/O而无需编写自定义的本机代码。NIO将最耗时的I/O操作(即填充和提取缓冲区)转移到操作系统
    ,因而可极大的提高速度。
  2. 流与块的比较
    原来的I/O库与NIO最重要区别是数据打包和传输方式。原来的I/O以流的方式处理数据,而NIO以块的方式处理数据。
  • 面向流的I/O系统一次一个字节地处理数据,一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。不利的一面是,面向流的I/O通常相当慢。
  • 一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理的数据比按流式的字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。

代码示例

import java.nio.ByteBuffer;

public class NIODemo {

    public static void main(String[] args) {
        // 创建一个字节缓冲区,申请内存空间为8个字节
        ByteBuffer buf = ByteBuffer.allocate(8);

        // 缓冲区内部细节:三个关键状态变量
        System.out.println("position = " + buf.position() + "\nlimit = " + buf.limit() + "\ncapacity = " + buf.capacity());
        System.out.println("==========================");

        // 向缓冲区写入数据
        buf.put((byte) 10);
        buf.put((byte) 20);
        buf.put((byte) 30);
        buf.put((byte) 40);

        System.out.println("position = " + buf.position() + "\nlimit = " + buf.limit() + "\ncapacity = " + buf.capacity());
        System.out.println("==========================");

        // 缓冲区的反转
        buf.flip();
        System.out.println("position = " + buf.position() + "\nlimit = " + buf.limit() + "\ncapacity = " + buf.capacity());
        System.out.println("==========================");

        // 告知在当前位置和限制之间是否有元素
        if(buf.hasRemaining()) {
            // 返回当前位置与限制之间的元素数
            for(int i = 0;i < buf.remaining(); i++) {
                byte b = buf.get(i);// 从缓冲区取出数据
                System.out.println(b);
            }
        }// if
    }// main
}

原文地址:https://www.cnblogs.com/zxfei/p/10893429.html

时间: 2024-11-06 09:30:14

Java NIO学习的相关文章

java nio学习笔记(一)

位置保留,待用 java nio学习笔记(一),布布扣,bubuko.com

Java NIO 学习总结 学习手册

原文 并发编程网(翻译):http://ifeve.com/java-nio-all/  源自 http://tutorials.jenkov.com/java-nio/index.html Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,而NIO是基于通道(Channel)和缓冲区(Buffer)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中. Java NIO: Non-blocking IO(非阻塞IO

Java NIO学习笔记(一)

文章目录: 1.什么是IO 2.什么是Java NIO 3.I/O常见概念 4.为什么使用NIO 5.IO VS NIO 一.什么是IO I/O 或者输入/输出 , 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的.单独的程序一般是让系统为它们完成大部分的工作.在 Java 编程中,直到最近一直使用 流 的方式完成 I/O.所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象

java NIO 学习笔记

项目组是做IM产品的,服务端当然用的是NIO技术做通信底层.但是一直都是对NIO有些理论的了解,没有实践,最近有空了,就实践了下NIO. NIO,新IO,也称之为非阻塞IO.非阻塞是它跟传统IO的最重要的区别之一.传统IO用Socket进行通信,NIO则用channel进行消息交互.channel必须注册到selector上,把它感兴趣的事件告诉selector.这是个观察者模式的实现.可以这样描述channel和selector的关系,channel是火车轨道,selector是火车调度室.多

Java NIO学习笔记

NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的. Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启

java nio学习(四)

scatter/gather Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作. 分散(scatter)从Channel中读取是指在读操作时将读取的数据写入多个buffer中.因此,Channel将从Channel中读取的数据"分散(scatter)"到多个Buffer中. 聚集(gather)写入Channel是指在写操作时将多个buffer的数

java nio学习(五)

通道之间的数据传输 在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个channel. transferFrom() FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中).下面是一个简单的例子: RandomAccessFile fromFile

Java NIO学习之Buffer

Java NIO的核心部件: Buffer Channel Selector Buffer 是一个数组,但具有内部状态.如下4个索引: capacity:总容量 position:下一个要读取/写入的元素索引 limit:限制,第一个不能读取/写入的元素索引 mark:位置标记,重置position //通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position.之后可以通过调用Buffer.reset()方法恢复到这个position// 0 <= mark <

Java NIO学习笔记八 DatagramChannel

Java NIO DatagramChannel Java NIO DatagramChannel是可以发送和接收UDP数据包的通道.由于UDP是一种无连接网络协议,因此您不能默认读取和写入DatagramChannel其他通道.而是发送和接收数据包. 打开DatagramChannel 打开一个DatagramChannel代码: DatagramChannel channel = DatagramChannel.open(); channel.socket().bind(new InetSo