注:利用 FileChannel.transferTo 和 FileChannel.transferFrom 方法可以更高效地读写文件。
(《FileChannel 数据传输》)
原文:《Java NIO FileChannel》
Java NIO 中的 FileChannel 可用于读写文件。FileChannel 总是以 阻塞 模式运行,不支持非阻塞模式。
开启 FileChannel
可通过调用 FileInputStream、FileOutputStream 或 RandomAccessFile 的 getChannel() 方法来获得 FileChannel
RandomAccessFile file = new RandomAccessFile("test.txt", "rw"); FileChannel channel = aFile.getChannel();
也可通过调用 FileChannel 的静态方法 open(Path, OpenOption...) 或 open(Path, Set<? extends OpenOption>, FileAttribute<?>...) 开启
读取 FileChannel 中的数据
通常可调用 FileChannel 的 read(ByteBuffer) 方法将数据从channel的当前位置开始,读取到 buffer 中。
如果返回值为 -1,则表示已读到文件末尾。
ByteBuffer buffer = ByteBuffer.allocate(1024); int readByteCount = channel.read(buffer);
其它方法:
- read(ByteBuffer, long) 可以指定读取channel的位置,但不会改变 channel 当前位置。
- read(ByteBuffer[]) 和 read(ByteBuffer[], int, int) 属于 ScatteringByteChannel 的 数据分散 特性。
向 FileChannel 写数据
通常可调用 FileChannel 的 write(ByteBuffer) 方法将 buffer 当前位置开始的数据写入channel。
返回值表示本次写入 channel 的字节数,可能为0。所以需要放在while循环中,确保 buffer 中所有数据都被写入 channel。
// byte[] data = ... ByteBuffer buffer = ByteBuffer.allocate(data.length); buffer.put(data); buffer.flip(); while (buffer.hasRemaining()) { channel.write(buffer); }
其它方法:
- write(ByteBuffer, long) 可以指定写入channel的位置,但不会改变 channel 当前位置。
- write(ByteBuffer[]) 和 write(ByteBuffer[], int, int) 属于 GatheringByteChannel 的 数据聚集 特性。
关闭 FileChannel
可以直接调用 FileChannel.close() 方法关闭,也可以 try-with-resources 的方式关闭。
channel.close();
FileChannel 的 position
当读取 FileChannel 中的数据,或向其写入数据时,都会在 channel 的某个特定位置开始读取或写入。
如果不明确指定这个 位置,默认使用 channel 的 当前位置。
可通过 position() 和 position(long) 获取与设置 channel 的 当前位置.
FileChannel 的 size
FileChannel.size() 方法返回的是 channel 所对应文件的大小(字节数)
裁剪 FileChannel
FileChannel.truncate(long) 方法可将 channel 中超出指定大小的数据丢弃。
如果指定的数据量大于等于当前 channel 的数据量,则原数据不会被改变。
如果指定的数据量小于 channel 的 position(当前位置),则 channel 的 position 会被更新为所指定数据量长度。
强制 FileChannel 数据落盘
出于性能方面的考虑,操作系统可能会先将 FileChannel 中的数据缓存在内存中,而不是直接写到磁盘。
可调用 FileChannel.force(boolean) 方法将那些尚未落盘的数据都写到磁盘。
- force(true) 表示将文件内容和元信息都写入磁盘。
- force(false) 表示只将文件内容写入磁盘,不包含元信息。
相关推荐
Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java NIO系列教程(十一) Pipe Java ...
java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java NIO和java并发编程的书籍java...
Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据文件Java nio 超大数据文件 超大数据...
Java NIO英文高清原版
7.1 打开一个FileChannel 7.2 从FileChannel通道中读取数据 7.3 向FileChannel中写入数据: 7.4 关闭FileCha
05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 08-Java NIO-Channel-ServerSocketChannel.mp4 09-Java NIO-Channel-SocketChannel.mp4 10-Java NIO-Channel-...
讲解了 JavaIO 与 JAVA NIO区别,JAVA NIO设计理念,以及JDK中java NIO中语法的使用
Java NIO(New IO)是一个可以替代标准Java IO API的IO API(从Java 1.4开始),Java NIO提供了与标准IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和缓冲区) 标准的IO基于字节流和字符流进行操作的,...
Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...
java nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socketjava nio 实现socket
java NIO是 java New IO 的简称,在 jdk1.4 里提供的新 api 。 Sun 官方标榜的特性如下: – 为所有的原始类型提供 (Buffer) 缓存支持。 – 字符集编码解码解决方案。 – Channel :一个新的原始 I/O 抽象。 – 支持...
04-Java NIO-Channel-FileChannel(介绍和示例).mp4 05-Java NIO-Channel-FileChannel详解(一).mp4 06-Java NIO-Channel-FileChannel详解(二).mp4 07-Java NIO-Channel-Socket通道-概述.mp4 08-Java NIO-Channel-...
基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现五子棋游戏.zip基于Java NIO实现五子棋游戏.zip 基于Java NIO实现...
原文:《Java NIO Scatter / Gather》 Scatter(分散):将一个 Channel 中的数据读取到多个 Buffer 中。 Gather(聚集):将多个 Buffer 中的数据写入一个 Channel 中。 Scatter/Gather 机制可以方便处理多个分开的...
java侧起server(NioUdpServer1.java),基于Java Nio的selector 阻塞等候,一个android app(NioUdpClient1文件夹)和一个java程序(UI.java)作为两个client分别向该server发数据,server收到后分别打印收到的消息...
java NIO技巧及原理解析,java IO原理,NIO框架分析,性能比较
java NIO.zip
java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现Reactor模型源码java基于NIO实现...
java nio 读文件,java nio 读文件
JAVA NIO学习资料JAVA NIO学习资料