Java.nio vs Java.io:深度比较与解析

需积分: 10 2 下载量 164 浏览量 更新于2024-09-14 收藏 205KB PDF 举报
"Java.nio与Java.io的比较" 在Java编程中,输入输出(I/O)操作是不可或缺的一部分。Java提供了两种主要的I/O模型:Java.io和Java.nio。这两个包各自有不同的特性和应用场景,理解它们的区别对于优化程序性能至关重要。 Java.io概述: Java.io包是Java早期提供的I/O系统,主要用于系统输入和输出,通过数据流进行处理。它支持多种类型的数据,包括简单的字节、基本数据类型、本地化字符以及对象。在Java.io中,流是一个数据序列,程序可以使用输入流从源读取数据,使用输出流向目的地写入和发送数据。所有字节流类都继承自InputStream和OutputStream基类。例如,FileInputStream和FileOutputStream分别用于文件的读写操作。 Java.nio简介: Java.nio(New Input/Output)是Java 1.4引入的一个新特性,提供了一种非阻塞I/O(Non-blocking I/O)机制,相比于Java.io,它具有更高的效率和并发性。NIO的核心组件包括通道(Channels)、缓冲区(Buffers)和选择器(Selectors)。通道是数据传输的路径,可以连接到数据源或目标,如文件、套接字等。缓冲区用于存储数据,并且提供了更高效的数据处理方式,允许批量读写。选择器则允许一个线程管理多个通道,从而提高了多路复用的性能。 Java.nio与Java.io的主要区别: 1. 阻塞与非阻塞:Java.io基于阻塞I/O模型,当进行读写操作时,如果数据未准备好,线程会被阻塞,直到数据可用。而Java.nio是非阻塞的,线程在数据未准备好时不会被阻塞,而是返回一个状态,这样可以执行其他任务,提高效率。 2. 缓冲区:Java.nio引入了缓冲区概念,数据在读写之前都会先放入缓冲区,减少了与操作系统交互的次数,提高了性能。 3. 多路复用:Java.nio的选择器允许一个线程同时处理多个通道,这在处理大量并发连接时非常有用,而Java.io通常需要为每个连接创建一个单独的线程,容易导致线程池资源的浪费。 4. 字节流与通道:Java.io使用字节流和字符流,而Java.nio使用通道。通道可以同时进行读写,且可以与多个缓冲区关联,而流只能单向传输数据。 5. 支持直接内存访问:Java.nio允许直接操作物理内存,跳过了Java堆,减少了内存复制,提高了性能。 6. 文件操作:Java.nio提供了FileChannel,可以进行大文件的高效读写,支持随机访问,而Java.io中的FileInputStream和FileOutputStream则不支持。 总结来说,Java.nio适合于需要高并发和低延迟的场景,如服务器端编程,而Java.io则更适合于简单、同步的I/O操作。开发者应根据具体项目需求来选择合适的I/O模型。在实际应用中,两者并非互斥,有时会结合使用,以充分利用各自的优点。

2023-07-13 09:15:56,872 WARN org.apache.flink.runtime.dispatcher.DispatcherRestEndpoint [] - Unhandled exception java.io.IOException: Connection reset by peer at sun.nio.ch.FileDispatcherImpl.read0(Native Method) ~[?:1.8.0_372] at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) ~[?:1.8.0_372] at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:1.8.0_372] at sun.nio.ch.IOUtil.read(IOUtil.java:192) ~[?:1.8.0_372] at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:379) ~[?:1.8.0_372] at org.apache.flink.shaded.netty4.io.netty.buffer.PooledByteBuf.setBytes(PooledByteBuf.java:253) ~[flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) ~[flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:350) ~[flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:151) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) [flink-dist-1.15.3.jar:1.15.3] at org.apache.flink.shaded.netty4.io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) [flink-dist-1.15.3.jar:1.15.3] at java.lang.Thread.run(Thread.java:750) [?:1.8.0_372]

2023-07-14 上传