`

【Java NIO 简例】FileChannel

    博客分类:
  • Java
nio 
阅读更多

注:利用 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) 表示只将文件内容写入磁盘,不包含元信息。

 

分享到:
评论

相关推荐

    JavaNIO chm帮助文档

    Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java NIO系列教程(十一) Pipe Java ...

    java NIO.zip

    Java NIO支持多种类型的通道,包括文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道(ServerSocketChannel)等。通道可以同时进行读写操作,并且可以实现异步读写。 2. **缓冲区(Buffers...

    java NIO和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,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java平台中用于替代标准I/O(BIO)模型的一种新机制。NIO在Java 1.4版本引入,提供了更高效的数据处理和通道通信方式,特别适用于高并发、大数据...

    java nio 包读取超大数据文件

    ### Java NIO 处理超大数据文件的知识点详解 #### 一、Java NIO简介 Java NIO(New IO)是Java平台上的新输入/输出流API,它提供了与传统IO(即Java IO)不同的数据处理方式。NIO在Java 1.4版本引入,并在后续版本...

    muyinchen#woker#07 Java的NIO之FileChannel1

    7.1 打开一个FileChannel 7.2 从FileChannel通道中读取数据 7.3 向FileChannel中写入数据: 7.4 关闭FileCha

    Java NIO实战开发多人聊天室

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

    java nio入门学习,两个pdf

    Java NIO提供了多种类型的通道,如FileChannel、SocketChannel、DatagramChannel等,分别对应于文件、套接字和UDP通信。 2. **缓冲区(Buffers)**:缓冲区是存储数据的主要对象,所有的I/O操作都是通过缓冲区进行的...

    java NIO技巧及原理

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(IO)相比,提供了更加高效的数据传输方式。在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于...

    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 中文 Java NIO 中文 Java NIO 中文文档

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的 Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了 如何才能充分利用新的 I/O ...

    java NIO实例

    Java NIO提供了一些常见的通道实现,如SocketChannel(用于网络通信)、FileChannel(用于文件操作)等。 3. **Buffer(缓冲区)**:在NIO中,数据读写都是通过缓冲区进行的。缓冲区是一个可以容纳特定类型数据(如...

    Java NIO 中英文版 + Pro Java 7 NIO.2

    5. **文件系统操作**:NIO提供FileChannel,可以高效地进行文件读写操作,包括映射文件到内存(MappedByteBuffer)。 6. **管道(Pipes)**:管道是两个线程之间进行单向数据传输的通道,用于线程间通信。 7. **...

    一个java NIO的例子

    Java NIO提供了多种类型的通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信,DatagramChannel用于UDP通信。通道可以进行读写操作,并且是非阻塞的,这意味着如果数据未准备好,...

    java nio 读文件

    import java.nio.channels.FileChannel; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; public class FeiNioRead { public static void main(String[] args) { try (FileChannel ...

    Java NIO Socket基本

    Java NIO(New Input/Output)是Java标准库中提供的一种I/O模型,与传统的 Blocking I/O(同步阻塞I/O)相对。NIO在Java 1.4版本引入,其设计目标是提供一种更高效、更灵活的I/O操作方式,特别适合处理大量并发连接...

    Java.NIO资源下载资源下载

    根据提供的文件信息,我们可以提取并总结出关于Java NIO(New Input/Output)的重要知识点。 ### Java NIO 概述 Java NIO 是 Java 平台的一个重要特性,首次出现在 Java 1.4 版本中。它为 Java 开发者提供了一套...

Global site tag (gtag.js) - Google Analytics