在NIO中有几个比较关键的概念:Channel,Buffer,Selector。
1. Channel(通道)
顾名思义,就是通向什么的道路,为某个提供了渠道。
在传统IO中,我们要读取一个文件中的内容,通常是像下面这样读取的:
package com.mycom.test.nio; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class TestIO { public static void main(String[] args) { try { File file = new File("d:/data.txt"); InputStream inputStream = new FileInputStream(file); byte[] bytes = new byte[1024]; inputStream.read(bytes); inputStream.close(); System.out.println(new String(bytes)); } catch (IOException e) { e.printStackTrace(); } } }这里的InputStream实际上就是为读取文件提供一个的通道。
但是,在传统IO中,Stream是单向的,比如InputStream只能进行读取操作,OutputStream只能进行写操作。而NIO中Channel是双向的,既可用来进行读操作,又可用来进行写操作。
以下是常用的几种通道:
- FileChannel:可以从文件读或者向文件写入数据;
- SocketChanel:以TCP来向网络连接的两端读写数据;
- ServerSocketChannel:能够监听客户端发起的TCP连接,并为每个TCP连接创建一个新的Socket Channel来进行数据读写;
- DatagramChannel:以UDP协议来向网络连接的两端读写数据。
下面给出通过FileChannel来向文件中写入数据的一个例子:
package com.mycom.test.nio; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; /** * FileChannel读取文件 * * @author guweiqiang */ public class TestFileChannel { public static void main(String[] args) { try { File file = new File("d:/writeData.txt"); FileOutputStream outputStream = new FileOutputStream(file); FileChannel fileChannel = outputStream.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(1024); String ss = "hello world!"; buffer.put(ss.getBytes()); buffer.flip(); //此处必须要调用buffer的flip方法 fileChannel.write(buffer); fileChannel.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
通过上面的程序会向工程目录下的data.txt文件写入字符串"java nio",注意在调用channel的write方法之前必须调用buffer的flip方法,否则无法正确写入内容(flip方法的作用是首先读取数据到Buffer,然后反转Buffer,接着再从Buffer中读取数据)。
相关推荐
本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...
在深入了解Java NIO(New IO)之前,我们需要先明确几个基础概念: - **IO (Input/Output)**:输入输出操作是计算机系统与外部设备(如硬盘、键盘、网络等)之间交换数据的过程。它是操作系统的核心功能之一,通常...
为此,Java 1.4 版本引入了新的I/O处理方式——NIO,即New IO。NIO提供了一种基于通道(Channel)和缓冲区(Buffer)的新模型。 - **通道(Channel)**:可以理解为数据的双向通道,支持数据的读取和写入。 - **缓冲...
**Buffer**是NIO API的核心概念之一,它定义了一个线性的原始类型数据容器接口。每种原始类型(除`boolean`外)都有一个对应的Buffer子类,如`ByteBuffer`、`CharBuffer`等。这些Buffer子类继承自通用的`Buffer`类,...
除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...
标题 "nio-2015:NIO 2015 第二轮——我的解决方案" 提到了 "NIO",这是Non-blocking I/O(非阻塞I/O)的缩写,通常指的是Java平台中的一个特性,它允许程序进行高效的数据读写操作,而不会在等待数据准备就绪时阻塞...
为了解决这些问题,从JDK1.4开始,Java引入了一套新的I/O框架——NIO(Non-blocking I/O),它不仅提供基于缓冲区的操作,还支持非阻塞模式,极大地提高了I/O处理效率。 #### NIO核心组件 NIO的架构主要分布在几个...
本章主要探讨的是Java NIO中的核心概念——通道(Channel)。通道是Java NIO中连接到I/O设备(如文件、网络套接字、硬件设备等)的接口,它允许数据从源到目的地进行传输。 在Java NIO中,通道和缓冲区(Buffer)是...
NIO的工作机制主要体现在以下几个方面: 1. **非阻塞操作**:NIO中的Channel支持非阻塞模式,这意味着当没有数据可读或没有空间可写时,不会阻塞当前线程,而是立即返回。 2. **多路复用**:Selector能够监控多个...
为此,从JDK 1.4开始,Java引入了一种新的IO操作模型——NIO(New IO),旨在提高程序处理大量并发连接的能力。NIO的主要特点在于它提供了一套基于缓冲区(buffer)且支持非阻塞(non-blocking)IO操作的API。 ####...
在Java基础部分,初学者会接触到以下几个关键知识点: 1. **Java环境搭建**:包括下载JDK(Java Development Kit),设置环境变量如JAVA_HOME, PATH, CLASSPATH,以及如何运行第一个Java程序——经典的"Hello, ...
在讨论线程IO模型之前,首先需要明确几个概念。IO模型通常指的是操作系统处理输入输出操作的方式,涉及到线程或进程如何与数据输入输出设备进行交互,以及这种交互的效率和性能。在传统的IO模型中,当线程进行读写...
### 经典算法导论——深入理解Java中的关键概念与技术 #### 一、新I/O:现代Java程序设计中的高效文件处理 ##### 1. 缓冲器(Buffer)和通道(Channel) - **缓冲器(Buffer)**:是Java NIO的核心组件之一,用于存储...
下面将根据这些信息提炼出几个重要的知识点。 ### 一、Java网络编程概述 1. **Java与网络编程的关系**:Java语言自诞生以来就内置了对网络的支持,其设计理念之一就是“编写一次,到处运行”,这一特性使得Java在...
学习Netty源码可以从以下几个方面入手: 1. 了解TCP协议基础,理解连接建立、数据传输和关闭的过程。 2. 熟悉Java多线程,理解线程池和并发控制。 3. 学习NIO的基本概念,包括Selector、Channel和Buffer等。 4. 分析...
书中可能涵盖了以下几个关键知识点: 1. **Netty概述**:介绍Netty的基本架构和设计理念,包括其非阻塞I/O模型,以及为什么它比传统的Java NIO更强大。 2. **Channel与Handler**:讲解Netty中的核心组件——...
2. **Netty框架**:理解Netty的工作原理,包括BIO、NIO、AIO的区别,以及Netty的Channel、EventLoop、Handler等核心概念。 3. **WebSocket通信**:学习WebSocket协议,实现服务器与客户端的双向通信。 4. **数据库...
在Java面试中,以下几个关键知识点通常是面试官的重点考察对象: 1. **Java基础**:这是每个Java开发者必须掌握的基本功。包括但不限于数据类型、变量、运算符、流程控制(if-else,switch,for,while)、数组、...
文件的主要内容可以分成以下几个部分: 1. JVM部分: JVM是Java虚拟机的缩写,它负责执行Java程序的字节码指令。文档首先介绍了JVM的内存区域,包括线程私有的区域,如程序计数器、虚拟机栈和本地方法区,以及线程...
此外,Java NIO中的非堵塞IO模型还利用了观察者模式(Observer Pattern),通过Selector来监控多个Channel的状态变化,从而实现了高效的数据传输。 #### 五、示例与源码分析 为了更好地理解Java IO的工作原理,可以...