本文共 3245 字,大约阅读时间需要 10 分钟。
NIO与传统IO的主要区别在于操作方式:
NIO引入了通道(Channel)和缓冲区(Buffer),优化了数据传输和处理流程。
缓冲区的核心属性关系:
0 ≤ position ≤ limit ≤ capacity 缓冲区属性可动态调整,但容量固定。 直接缓冲区适合需要高性能的场景,但可能导致内存泄漏;非直接缓冲区更安全,但性能略低。
1. 使用非直接缓冲区复制JPG照片
File input = new File("input.jpg"); File output = new File("output.jpg"); ByteBuffer inputBuffer = ByteBuffer.allocateDirect(1024); ByteBuffer outputBuffer = ByteBuffer.allocateDirect(1024); FileChannel inputChannel = FileChannel.open(input, StandardOpenOption.READ); FileChannel outputChannel = FileChannel.open(output, StandardOpenOption.WRITE); while (inputBuffer.hasRemaining() && outputBuffer.hasRemaining()) { int read = inputChannel.read(inputBuffer); if (read == -1) break; int written = outputChannel.write(outputBuffer); if (written == -1) break; } inputBuffer.clear(); outputBuffer.clear(); inputChannel.close(); outputChannel.close(); inputBuffer.close(); outputBuffer.close(); 2. 使用直接缓冲区复制JPG照片
File input = new File("input.jpg"); File output = new File("output.jpg"); MappedByteBuffer inputBuffer = Files.mapByteBuffer(input, 0, 1024); MappedByteBuffer outputBuffer = Files.mapByteBuffer(output, 1024, 1024); FileChannel inputChannel = FileChannel.open(input, StandardOpenOption.READ); FileChannel outputChannel = FileChannel.open(output, StandardOpenOption.WRITE); while (inputBuffer.hasRemaining() && outputBuffer.hasRemaining()) { long read = inputChannel.read(inputBuffer); if (read == -1) break; long written = outputChannel.write(outputBuffer); if (written == -1) break; } inputBuffer.clear(); outputBuffer.clear(); inputChannel.close(); outputChannel.close(); inputBuffer.close(); outputBuffer.close(); 3. 通道间数据传输(直接缓冲区)
CompletionHandlerhandler = (v, t) -> System.out.println("文件已复制"); File inputFile = new File("input.txt"); File outputFile = new File("output.txt"); FileChannel inputChannel = FileChannel.open(inputFile, StandardOpenOption.READ); FileChannel outputChannel = FileChannel.open(outputFile, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.POSIX); ByteBuffer buffer = ByteBuffer.allocateDirect(8192); while (true) { int read = inputChannel.read(buffer); if (read == -1) break; int written = outputChannel.write(buffer); if (written == -1) break; buffer.flip(); outputChannel.read(buffer, 0, buffer.capacity(), handler); buffer.clear(); } inputChannel.close(); outputChannel.close(); buffer.clear();
通过合理配置缓冲区和使用分散读取/聚集写入,可以充分发挥NIO的优势,提升数据操作效率。
转载地址:http://puql.baihongyu.com/