java nio 中 files 和 nio channel 配合的核心做法是使用 files.newinputstream() 或 files.newoutputstream() 获取流,再通过 channels.newchannel() 将其包装为通道。这样做可以直接复用现有的文件路径操作,同时获得非阻塞、多路复用等 nio 通道的能力。

如何将 InputStream 转换为 ReadableByteChannel
将 InputStream 转换为 ReadableByteChannel 后,可以将其用于 Selector 注册(需自定义)或直接作为数据源。转换后的通道在读取时会委托给底层的 InputStream。

import java.io.FileInputStream; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; public class Main { public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream("test.txt"); ReadableByteChannel channel = Channels.newChannel(fis); byte[] buffer = new byte[1024]; int bytesRead = channel.read(buffer); System.out.println("Read bytes: " + bytesRead); channel.close(); fis.close(); } }
如何将 OutputStream 转换为 WritableByteChannel
将 OutputStream 转换为 WritableByteChannel 后,可以向其中写入字节数据。这种转换常用于将 NIO 数据写入到传统的输出流中。

import java.io.FileOutputStream; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; public class Main { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("output.txt"); WritableByteChannel channel = Channels.newChannel(fos); ByteBuffer buffer = ByteBuffer.wrap(new byte[]{72, 101, 108, 108, 111}); // "Hello" channel.write(buffer); channel.close(); fos.close(); } }
转换后的通道是否支持非阻塞模式?
通过 Channels.newChannel() 转换得到的通道不支持非阻塞模式。它们本质上是基于流的包装,因此调用 configureBlocking(false) 会抛出 IllegalStateException。如果需要非阻塞行为,应直接使用 FileChannel 或通过 AsynchronousFileChannel 实现异步 I/O。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











