- 
                Notifications
    
You must be signed in to change notification settings  - Fork 20
 
Java NIO
目录 start
- 
NIO
- Java IO 与 NIO的主要区别
 - 
通道(Channel)与缓冲区(Buffer)
- [1、缓冲区(Buffer)](#1、[缓冲区buffer]srcbuffertestbufferjava)
 - 
2、通道
- 1、主要的Channel接口实现类
 - 2、使用方法
 - 3、通道之间的数据传输
 - 4、分散(Scatter)与聚集(Gather)
 - [5、字符集](#5、[字符集]srcchanneltestcharsetjava)
 - 6、网路IO(核心内容)
 
 - [3、管道](#3、[管道]srcpipetestpipejava)
 
 
 
目录 end|2020-04-27 23:42|
| IO | NIO | 
|---|---|
| 面向流 | 面向缓冲区 | 
| 阻塞IO | 非阻塞IO | 
| 选择器 | 
Channel表示打开IO设备(如,文件、套接字)的连接。若要使用NIO,则需获取用于连接IO设备的管道以及容纳数据的缓冲区。然后操作缓冲区,对数据进行处理
在Java NIO中负责数据的存取,缓冲区就是数组用于操作不同类型的数据。不同的数据类型提供了不同的缓冲区,boolean除外。
- ByteBuffer
 - CharBuffer
 - DoubleBuffer
 - FloatBuffer
 - IntBuffer
 - LongBuffer
 - ShortBuffer
 
- 
使用
allocate()方法获取一定大小的缓冲区:ByteBuffer buffer = ByteBuffer.allocate(1024); - 
使用
put()存入数据到缓冲区:buffer.put("hello".getBytes()); - 
使用
flip()切换成读取数据模式:buffer.flip(); - 
使用
get()获取缓冲区内的数据:byte[] bytes = new byte[buffer.limit()]; buffer.get(bytes); 
- 
mark:标记, 表示记录当前position的位置,可通过reset()恢复到mark的位置 - 
position:位置,缓冲区中正在操作数据的位置 - 
limit:界限,缓冲区中可以操作数据的大小。 limit后的数据不可读写 - 
capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明不可改变 
- 
非直接缓冲区:通过
allocate()方法分配缓冲区,缓冲区将建立在JVM的内存中 - 
直接缓冲区:通过
allocateDirect()方法分配缓冲区,缓冲区将直接建立在物理内存中 
Channel表示IO源与目标打开的连接,类似于传统的流。不过Channel不能直接访问数据,Channel只能与Buffer进行交互
- FileChannel
 - SocketChannel
 - ServerSocketChannel
 - DatagramChannel
 
- 
Java针对支持通道的类提供
getChannel()方法,这些类有:- 
本地IO
- FileInputStream/FileOutputStream
 - RandomAccessFile
 
 - 
网络IO
- Socket
 - ServerSocket
 - DatagramSocket
 
 
 - 
 - 
JDK 1.7中的NIO2针对各个通道提供了静态方法
open() - 
JDK 1.7中的NIO2中的Files工具类的
newByteChannel()方法 
- 利用Channel完成文件的复制(非直接缓冲区).
 
    @Test
    public void test1() throws IOException {
        FileInputStream fis = new FileInputStream("JavaNIO.iml");
        FileOutputStream fos = new FileOutputStream("JavaNIO2.iml");
        // 获取通道
        FileChannel inputChannel = fis.getChannel();
        FileChannel outputChannel = fos.getChannel();
        // 分配指定大小的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        // 将通道内的数据读入缓冲区
        while (inputChannel.read(buffer) != -1) {
            // 将缓冲区内的数据写入通道
            buffer.flip();  //  切换为读数据
            outputChannel.write(buffer);
            buffer.clear(); // 清空缓冲区
        }
        // 关闭通道
        outputChannel.close();
        inputChannel.close();
        fos.close();
        fis.close();
    }- 使用直接缓冲区复制文件(内存映射文件).
 
    @Test
    public void test2() throws IOException {
        // 使用Open()获取通道
        FileChannel inputChannel = FileChannel.open(Paths.get("JavaNIO.iml"), StandardOpenOption.READ);
        FileChannel outputChannel = FileChannel.open(Paths.get("JavaNIO2.iml"),
                StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW);
        // 内存映射文件,和使用allocateDirect()获取内存一样,内存在物理内存中
        MappedByteBuffer inputMappedBuffer = inputChannel.map(FileChannel.MapMode.READ_ONLY, 0, inputChannel.size());
        MappedByteBuffer outputMappedBuffer = outputChannel.map(FileChannel.MapMode.READ_WRITE, 0, inputChannel.size());
        // 直接对缓冲区进行读写操作
        byte[] bytes = new byte[inputMappedBuffer.limit()];
        inputMappedBuffer.get(bytes);
        outputMappedBuffer.put(bytes);
        // 关闭通道
        inputChannel.close();
        outputChannel.close();
    }- 
主要方法
- transferFrom()
 - transferTo()
 
 
    @Test
    public void test3() throws IOException {
        // 使用Open()获取通道
        FileChannel inputChannel = FileChannel.open(Paths.get("JavaNIO.iml"), StandardOpenOption.READ);
        FileChannel outputChannel = FileChannel.open(Paths.get("JavaNIO2.iml"),
                StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW);
        // 通道间的数据传输(二用一)
        // inputChannel.transferTo(0, inputChannel.size(), outputChannel);
        outputChannel.transferFrom(inputChannel, 0, inputChannel.size());
        inputChannel.close();
        outputChannel.close();
    }- 
分散读取(Scattering Reads): 将通道中的数据分散到多个缓冲区中
 - 
聚集写入(Gathering Writes):将多个缓冲区内的数据聚集到通道中
 
5、字符集
指定字符集,避免乱码。常用于CharBuffer与ByteBuffer之间。
传统IO为阻塞式的,NIO通过选择器实现非阻塞式IO
- 
核心内容
- Channel
 - Buffer
 - Selector
 
 
1、TCP连接
主要Channel为SocketChannel与ServerSocketChannel;
2、UDP连接
主要Channel为DatagramChannel
3、管道
Java NIO 管道是2个线程之间的单向数据连接,Pipe有一个source通道和一个sink通道。数据会被写到sink通道,从source通道读取
- 
【 Algorithm 】
 - 
【 Blog 】
 - 
【 C 】
 - 
【 Database 】
 - 
【 Distributed 】
 - 
【 FrontEnd 】
- 【 FrontEnd/Frame 】
 - 【 FrontEnd/Node 】
 - Font
 - Hexo
 - JavaScript
 - LearnPS
 - ResponseCode
 - SVG
 - ViewSolution
 - extjs学习笔记
 
 - 
【 Functional 】
 - 
【 Go 】
 - 
【 Groovy 】
 - 
【 Java 】
- 【 Java/AdvancedLearning 】
- 【 JavaBasic 】
 - 【 JavaCache 】
 - 【 JavaCollection 】
 - 【 JavaConcurrency 】
 - 【 JavaMap 】
 - Annotation
 - ClassFile
 - Collection
 - Concurrency
 - Deploy
 - Exception
 - ExtendsAndInterface
 - Generics
 - IO
 - JDBC
 - JDKAndJRE
 - JMX
 - JVM
 - Java11
 - Java7
 - Java8
 - JavaNetwork
 - JavaReleaseVersion
 - JavaWeb
 - JvmPerformance
 - MQ
 - MultipleLanguage
 - Proxy
 - Reflection
 - Serialize
 - SyntaxAndType
 - Thread
 - WebPerformance
 
 - 【 Java/Android 】
 - 【 Java/Ecosystem 】
 - 【 Java/MSA 】
 - 【 Java/Spring 】
 - 【 Java/TemplateEngine 】
 - 【 Java/Test 】
 - 【 Java/Tool 】
 - 【 Java/thread 】
 - AlibabaJavaStandard
 - DesignPattern
 - HashMap解析
 - Java-NIO
 - Java虚拟机
 - Log
 - MIS
 - Quartz
 - RESTful
 - WebSocket学习笔记
 - ZooKeeper学习笔记
 - android学习笔记
 
 - 【 Java/AdvancedLearning 】
 - 
【 Kotlin 】
 - 
【 Linux 】
- 【 Linux/Alpine 】
 - 【 Linux/Arch 】
 - 【 Linux/Base 】
 - 【 Linux/Centos 】
 - 【 Linux/Container 】
 - 【 Linux/Debian 】
 - 【 Linux/Tool 】
 - JavaDevInit
 - Linux系统学习
 
 - 
【 MyBlog 】
 - 
【 Python 】
- 【 Python/Tool 】
 - Python
 - PythonConcurrent
 - PythonGUI
 - PythonGame
 - PythonNet
 - PythonOffices
 - PythonWeb
 - Python基础
 - Python核心学习
 
 - 
【 Reactive 】
 - 
【 Rust 】
 - 
【 Scala 】
 - 
【 Script 】
 - 
【 Skills 】
- 【 Skills/Application 】
 - 【 Skills/CS 】
 - 【 Skills/Cache 】
 - 【 Skills/Councurrency 】
 - 【 Skills/DevOps 】
 - 【 Skills/Document 】
 - 【 Skills/Ecology 】
 - 【 Skills/Network 】
 - 【 Skills/Search 】
 - 【 Skills/SoftwareEngineering 】
 - 【 Skills/Spider 】
 - 【 Skills/Test 】
 - 【 Skills/Vcs 】
 - 【 Skills/Work 】
 - AppManual
 - CelebrityQuotes
 - Miscellaneous
 - Platform
 - Problem
 - Protobuf
 - RegularExpression
 - SoftwareDesignEngineer
 - Website
 
 - 
【 Windows 】