- 
                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 】