Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。
FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。
打开FileChannel
在使用FileChannel之前,必须先打开它。但是,我们无法直接打开一个FileChannel,需要通过使用一个InputStream、 OutputStream或RandomAccessFile来获取一个FileChannel实例。下面是通过RandomAccessFile打开 FileChannel的示例:
1 |
RandomAccessFile aFile = new RandomAccessFile( "data/nio-data.txt" , "rw" );
|
2 |
FileChannel inChannel = aFile.getChannel(); |
从FileChannel读取数据
调用多个read()方法之一从FileChannel中读取数据。如:
1 |
ByteBuffer buf = ByteBuffer.allocate(48); |
2 |
int bytesRead = inChannel.read(buf); |
首先,分配一个Buffer。从FileChannel中读取的数据将被读到Buffer中。
然后,调用FileChannel.read()方法。该方法将数据从FileChannel读取到Buffer中。read()方法返回的int值表示了有多少字节被读到了Buffer中。如果返回-1,表示到了文件末尾。
向FileChannel写数据
使用FileChannel.write()方法向FileChannel写数据,该方法的参数是一个Buffer。如:
01 |
String newData = "New String to write to file..." + System.currentTimeMillis(); |
02 |
03 |
ByteBuffer buf = ByteBuffer.allocate(48); |
04 |
buf.clear(); |
05 |
buf.put(newData.getBytes()); |
06 |
07 |
buf.flip(); |
08 |
09 |
while(buf.hasRemaining()) { |
10 |
channel.write(buf);
|
11 |
} |
注意FileChannel.write()是在while循环中调用的。因为无法保证write()方法一次能向FileChannel写入多少字节,因此需要重复调用write()方法,直到Buffer中已经没有尚未写入通道的字节。
关闭FileChannel
用完FileChannel后必须将其关闭。如:
1 |
channel.close(); |
FileChannel的position方法
有时可能需要在FileChannel的某个特定位置进行数据的读/写操作。可以通过调用position()方法获取FileChannel的当前位置。
也可以通过调用position(long pos)方法设置FileChannel的当前位置。
这里有两个例子:
1 |
long pos = channel.position();
|
2 |
channel.position(pos + 123 );
|
如果将位置设置在文件结束符之后,然后试图从文件通道中读取数据,读方法将返回-1 —— 文件结束标志。
如果将位置设置在文件结束符之后,然后向通道中写数据,文件将撑大到当前位置并写入数据。这可能导致“文件空洞”,磁盘上物理文件中写入的数据间有空隙。
FileChannel的size方法
FileChannel实例的size()方法将返回该实例所关联文件的大小。如:
1 |
long fileSize = channel.size();
|
FileChannel的truncate方法
可以使用FileChannel.truncate()方法截取一个文件。截取文件时,文件将中指定长度后面的部分将被删除。如:
1 |
channel.truncate( 1024 );
|
这个例子截取文件的前1024个字节。
FileChannel的force方法
FileChannel.force()方法将通道里尚未写入磁盘的数据强制写到磁盘上。出于性能方面的考虑,操作系统会将数据缓存在内存中,所以无法保证写入到FileChannel里的数据一定会即时写到磁盘上。要保证这一点,需要调用force()方法。
force()方法有一个boolean类型的参数,指明是否同时将文件元数据(权限信息等)写到磁盘上。
下面的例子同时将文件数据和元数据强制写到磁盘上:
1 |
channel.force( true );
|
相关推荐
Java NIO系列教程(七) FileChannel Java NIO系列教程(八) SocketChannel Java NIO系列教程(九) ServerSocketChannel Java NIO系列教程(十) Java NIO DatagramChannel Java NIO系列教程(十一) Pipe Java ...
### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...
### Java NIO 系列教程知识点详解 #### Java NIO 概述 Java NIO (New IO) 是从 Java 1.4 开始提供的一种新的 I/O 处理方式,旨在改进传统 Java IO API 的性能并引入更高效的数据处理机制。Java NIO 主要包括三大...
Java NIO中的主要通道包括FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,分别对应文件操作、UDP网络通信、TCP网络通信和服务器端的TCP连接。 4. **缓冲区(Buffer)** Java NIO提供了多种...
### Java NIO 系列教程知识点详解 #### 一、Java NIO 概述 Java NIO (New IO) 是 Java SE 1.4 版本引入的一种新的输入/输出方式,它提供了一种替代传统的 Java IO 包的方式。Java NIO 主要包括三个核心组成部分:*...
本文档旨在为Java程序员提供一个全面深入理解NIO库的教程,不仅涵盖了概念性的高级知识,还包括了底层编程细节。 #### 二、NIO概述 ##### 2.1 历史背景 - **原生I/O**:Java最初提供的I/O操作是基于流的,这在处理...
文件名称列表中,我们看到有多个以"Master Merlin's new I-O classes - JavaWorld-"开头的文章,这可能是一个系列教程,由Master Merlin这位专家在JavaWorld网站上发表,探讨了Java NIO的新特性。此外,还有"DANCE ...
- **主要类型**:Java NIO支持多种类型的通道,如`FileChannel`、`DatagramChannel`、`SocketChannel`等。 - **操作方式**:通过`read()`和`write()`方法实现数据的读取和写入。这些方法都是非阻塞的,这意味着它们...
- **参考资料**:本教程提供了一系列的代码示例,每个示例都是完整的 Java 程序的一部分,可以帮助读者更深入地理解 NIO 的各个组件。 - **代码下载与运行**:建议读者下载并运行这些代码示例,以加深对 NIO 概念的...
`java.hearing3oc`可能是指一个特定的教程系列或者代码示例集合,用于教授Java NIO的相关知识,`扣弄你澳大`这部分可能是误输入或者某种特定的表述,不直接影响知识点的解释。 通道接口包括以下常见的实现类: - *...
在"javaniofile:java.nio.file 上的谷歌环聊会话支持类"中,我们可能涉及到的是一个讨论或教程,该内容可能通过Google环聊进行分享,日期为2015年2月5日。虽然具体的课程内容没有直接给出,但我们可以基于`java.nio....
JDK 1.4还引入了一系列新的APIs和特性,如`java.nio.channels.spi.AbstractInterruptibleChannel`,`java.nio.channels.spi.AbstractSelectableChannel`,`java.nio.charset.StandardCharsets`等,这些APIs丰富了...
如果“SSD3”与固态硬盘相关,那么这个学习资源可能涵盖了Java如何与硬件设备交互,例如通过JNI(Java Native Interface)调用C/C++库来操作SSD驱动,或者使用Java的FileChannel和MappedByteBuffer进行高效的数据...
5. **零拷贝(Zero-Copy)**:Netty利用Java NIO的FileChannel.transferTo方法和DirectByteBuffer实现了零拷贝,减少了数据在内存中的复制,提高了性能。 6. **EventLoop**:每个WorkerGroup都由一个或多个Event...
- [Java IO 实例教程](https://www.tutorialspoint.com/java_io/index.htm):包含丰富的示例和实践指南。 通过以上内容,我们可以了解到Java IO的基础知识、常用流的特性和使用方法,以及如何进行性能优化等方面的...
8. **零拷贝**: Netty利用Java NIO的FileChannel.transferTo方法和DirectBuffer实现了零拷贝技术,提高了性能,尤其是在处理大文件或高吞吐量网络通信时。 9. **NIO和EPOLL**: Netty支持两种不同的事件模型,Java ...
8. **零拷贝**: Netty利用Java NIO的FileChannel.transferTo()和FileChannel.transferFrom()方法实现数据传输的零拷贝,提高效率。 9. **WebSocket与HTTP/2支持**: Netty提供了WebSocket和HTTP/2协议的支持,方便...
描述中的"Aula08"暗示这是一个系列教程的第八部分,可能是在深入讲解某个主题。结合标签"Java",我们可以推测这个压缩包包含与Java编程语言相关的档案系统或文件处理的学习资料。 Java是一种广泛使用的面向对象的...