`

NIO(六)—— NIO中的几个基础概念之一:Channel

    博客分类:
  • NIO
 
阅读更多

在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中读取数据)。

 

 

 

 

  • 大小: 15.3 KB
分享到:
评论

相关推荐

    Java NIO学习笔记——ByteBuffer用法

    本文主要关注的是Java NIO中的ByteBuffer,一个关键的数据容器,用于在通道(Channel)和缓冲区(Buffer)之间传输数据。ByteBuffer的用法是Java NIO学习中的核心内容。 首先,我们了解下ByteBuffer的基本概念。...

    Java nio详细介绍 详细介绍java nio

    在深入了解Java NIO(New IO)之前,我们需要先明确几个基础概念: - **IO (Input/Output)**:输入输出操作是计算机系统与外部设备(如硬盘、键盘、网络等)之间交换数据的过程。它是操作系统的核心功能之一,通常...

    java io 与java nio区别

    为此,Java 1.4 版本引入了新的I/O处理方式——NIO,即New IO。NIO提供了一种基于通道(Channel)和缓冲区(Buffer)的新模型。 - **通道(Channel)**:可以理解为数据的双向通道,支持数据的读取和写入。 - **缓冲...

    Java_NIO_API详解

    **Buffer**是NIO API的核心概念之一,它定义了一个线性的原始类型数据容器接口。每种原始类型(除`boolean`外)都有一个对应的Buffer子类,如`ByteBuffer`、`CharBuffer`等。这些Buffer子类继承自通用的`Buffer`类,...

    Java-NIO-系列教程

    除了以上提到的 Buffer 类型之外,Java NIO 还提供了一个特殊的 Buffer 类型——`MappedByteBuffer`,用于表示内存映射文件。这种方式能够提高文件的读写效率,但由于其实现较为复杂,本概述中不做详细介绍。 #### ...

    nio-2015:NIO 2015 第二轮——我的解决方案

    标题 "nio-2015:NIO 2015 第二轮——我的解决方案" 提到了 "NIO",这是Non-blocking I/O(非阻塞I/O)的缩写,通常指的是Java平台中的一个特性,它允许程序进行高效的数据读写操作,而不会在等待数据准备就绪时阻塞...

    JavaNIO_API帮助文档详解

    为了解决这些问题,从JDK1.4开始,Java引入了一套新的I/O框架——NIO(Non-blocking I/O),它不仅提供基于缓冲区的操作,还支持非阻塞模式,极大地提高了I/O处理效率。 #### NIO核心组件 NIO的架构主要分布在几个...

    032002_【第20章:Java新IO】_通道(Channel)_java_hearing3oc_扣弄你澳大_stoppedh

    本章主要探讨的是Java NIO中的核心概念——通道(Channel)。通道是Java NIO中连接到I/O设备(如文件、网络套接字、硬件设备等)的接口,它允许数据从源到目的地进行传输。 在Java NIO中,通道和缓冲区(Buffer)是...

    基于Java_NIO_开发高性能并发型服务器程序的研究.pdf

    NIO的工作机制主要体现在以下几个方面: 1. **非阻塞操作**:NIO中的Channel支持非阻塞模式,这意味着当没有数据可读或没有空间可写时,不会阻塞当前线程,而是立即返回。 2. **多路复用**:Selector能够监控多个...

    java NOI 学习

    为此,从JDK 1.4开始,Java引入了一种新的IO操作模型——NIO(New IO),旨在提高程序处理大量并发连接的能力。NIO的主要特点在于它提供了一套基于缓冲区(buffer)且支持非阻塞(non-blocking)IO操作的API。 ####...

    java-ppt.rar_java .ppt_java ppt_java基础 ppt_java基础 ppt_ppt jav

    在Java基础部分,初学者会接触到以下几个关键知识点: 1. **Java环境搭建**:包括下载JDK(Java Development Kit),设置环境变量如JAVA_HOME, PATH, CLASSPATH,以及如何运行第一个Java程序——经典的"Hello, ...

    11原理 1:鞭辟入里 —— 线程 IO 模型(1).md

    在讨论线程IO模型之前,首先需要明确几个概念。IO模型通常指的是操作系统处理输入输出操作的方式,涉及到线程或进程如何与数据输入输出设备进行交互,以及这种交互的效率和性能。在传统的IO模型中,当线程进行读写...

    经典算法导论

    ### 经典算法导论——深入理解Java中的关键概念与技术 #### 一、新I/O:现代Java程序设计中的高效文件处理 ##### 1. 缓冲器(Buffer)和通道(Channel) - **缓冲器(Buffer)**:是Java NIO的核心组件之一,用于存储...

    [Java网络编程(第3版,2004)].(Java.Network.Programming).Elliotte.Rusty.Harold.文字版

    下面将根据这些信息提炼出几个重要的知识点。 ### 一、Java网络编程概述 1. **Java与网络编程的关系**:Java语言自诞生以来就内置了对网络的支持,其设计理念之一就是“编写一次,到处运行”,这一特性使得Java在...

    Netty源码解析1

    学习Netty源码可以从以下几个方面入手: 1. 了解TCP协议基础,理解连接建立、数据传输和关闭的过程。 2. 熟悉Java多线程,理解线程池和并发控制。 3. 学习NIO的基本概念,包括Selector、Channel和Buffer等。 4. 分析...

    Netty权威指南 PDF电子书下载 带目录书签 完整版

    书中可能涵盖了以下几个关键知识点: 1. **Netty概述**:介绍Netty的基本架构和设计理念,包括其非阻塞I/O模型,以及为什么它比传统的Java NIO更强大。 2. **Channel与Handler**:讲解Netty中的核心组件——...

    gongyz-wxapp-little-shelf-master_springboot聊天_springboot_LittleM

    2. **Netty框架**:理解Netty的工作原理,包括BIO、NIO、AIO的区别,以及Netty的Channel、EventLoop、Handler等核心概念。 3. **WebSocket通信**:学习WebSocket协议,实现服务器与客户端的双向通信。 4. **数据库...

    [java面试宝典word]java自学网(javazx.com)MLDN魔乐科技-直击面试系列-破解Java面试题-1

    在Java面试中,以下几个关键知识点通常是面试官的重点考察对象: 1. **Java基础**:这是每个Java开发者必须掌握的基本功。包括但不限于数据类型、变量、运算符、流程控制(if-else,switch,for,while)、数组、...

    JAVA核心知识点整理.pdf

    文件的主要内容可以分成以下几个部分: 1. JVM部分: JVM是Java虚拟机的缩写,它负责执行Java程序的字节码指令。文档首先介绍了JVM的内存区域,包括线程私有的区域,如程序计数器、虚拟机栈和本地方法区,以及线程...

    Java_IO完全总结

    此外,Java NIO中的非堵塞IO模型还利用了观察者模式(Observer Pattern),通过Selector来监控多个Channel的状态变化,从而实现了高效的数据传输。 #### 五、示例与源码分析 为了更好地理解Java IO的工作原理,可以...

Global site tag (gtag.js) - Google Analytics