`
youjianbo_han_87
  • 浏览: 18601 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java NIO系列教程(七) FileChannel

 
阅读更多

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);
分享到:
评论

相关推荐

    JavaNIO chm帮助文档

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

    Java NIO系列教程(一) Java NIO 概述

    ### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...

    Java NIO系列教程

    ### Java NIO 系列教程知识点详解 #### Java NIO 概述 Java NIO (New IO) 是从 Java 1.4 开始提供的一种新的 I/O 处理方式,旨在改进传统 Java IO API 的性能并引入更高效的数据处理机制。Java NIO 主要包括三大...

    Java NIO 系列教程1

    Java NIO中的主要通道包括FileChannel、DatagramChannel、SocketChannel和ServerSocketChannel,分别对应文件操作、UDP网络通信、TCP网络通信和服务器端的TCP连接。 4. **缓冲区(Buffer)** Java NIO提供了多种...

    Java-NIO-系列教程

    ### Java NIO 系列教程知识点详解 #### 一、Java NIO 概述 Java NIO (New IO) 是 Java SE 1.4 版本引入的一种新的输入/输出方式,它提供了一种替代传统的 Java IO 包的方式。Java NIO 主要包括三个核心组成部分:*...

    Java Nio ibm技术文档

    本文档旨在为Java程序员提供一个全面深入理解NIO库的教程,不仅涵盖了概念性的高级知识,还包括了底层编程细节。 #### 二、NIO概述 ##### 2.1 历史背景 - **原生I/O**:Java最初提供的I/O操作是基于流的,这在处理...

    nio资料,自学用,多个网文

    文件名称列表中,我们看到有多个以"Master Merlin's new I-O classes - JavaWorld-"开头的文章,这可能是一个系列教程,由Master Merlin这位专家在JavaWorld网站上发表,探讨了Java NIO的新特性。此外,还有"DANCE ...

    java nio 详解

    - **主要类型**:Java NIO支持多种类型的通道,如`FileChannel`、`DatagramChannel`、`SocketChannel`等。 - **操作方式**:通过`read()`和`write()`方法实现数据的读取和写入。这些方法都是非阻塞的,这意味着它们...

    nio入门 IBM教材,pdf格式

    - **参考资料**:本教程提供了一系列的代码示例,每个示例都是完整的 Java 程序的一部分,可以帮助读者更深入地理解 NIO 的各个组件。 - **代码下载与运行**:建议读者下载并运行这些代码示例,以加深对 NIO 概念的...

    032002_【第20章:Java新IO】_通道(Channel)_java_hearing3oc_扣弄你澳大_stoppedh

    `java.hearing3oc`可能是指一个特定的教程系列或者代码示例集合,用于教授Java NIO的相关知识,`扣弄你澳大`这部分可能是误输入或者某种特定的表述,不直接影响知识点的解释。 通道接口包括以下常见的实现类: - *...

    javaniofile:java.nio.file 上的谷歌环聊会话支持类

    在"javaniofile:java.nio.file 上的谷歌环聊会话支持类"中,我们可能涉及到的是一个讨论或教程,该内容可能通过Google环聊进行分享,日期为2015年2月5日。虽然具体的课程内容没有直接给出,但我们可以基于`java.nio....

    Java JDK 1.4 Tutorial

    JDK 1.4还引入了一系列新的APIs和特性,如`java.nio.channels.spi.AbstractInterruptibleChannel`,`java.nio.channels.spi.AbstractSelectableChannel`,`java.nio.charset.StandardCharsets`等,这些APIs丰富了...

    Java-SSD3()

    如果“SSD3”与固态硬盘相关,那么这个学习资源可能涵盖了Java如何与硬件设备交互,例如通过JNI(Java Native Interface)调用C/C++库来操作SSD驱动,或者使用Java的FileChannel和MappedByteBuffer进行高效的数据...

    netty快速入门教程11集 共12集

    5. **零拷贝(Zero-Copy)**:Netty利用Java NIO的FileChannel.transferTo方法和DirectByteBuffer实现了零拷贝,减少了数据在内存中的复制,提高了性能。 6. **EventLoop**:每个WorkerGroup都由一个或多个Event...

    java io一些探讨

    - [Java IO 实例教程](https://www.tutorialspoint.com/java_io/index.htm):包含丰富的示例和实践指南。 通过以上内容,我们可以了解到Java IO的基础知识、常用流的特性和使用方法,以及如何进行性能优化等方面的...

    Netty实战-leolee-netty-practice.zip

    8. **零拷贝**: Netty利用Java NIO的FileChannel.transferTo方法和DirectBuffer实现了零拷贝技术,提高了性能,尤其是在处理大文件或高吞吐量网络通信时。 9. **NIO和EPOLL**: Netty支持两种不同的事件模型,Java ...

    netty4-awesome:netty4.x学习使用

    8. **零拷贝**: Netty利用Java NIO的FileChannel.transferTo()和FileChannel.transferFrom()方法实现数据传输的零拷贝,提高效率。 9. **WebSocket与HTTP/2支持**: Netty提供了WebSocket和HTTP/2协议的支持,方便...

    Aula08_Arqsw

    描述中的"Aula08"暗示这是一个系列教程的第八部分,可能是在深入讲解某个主题。结合标签"Java",我们可以推测这个压缩包包含与Java编程语言相关的档案系统或文件处理的学习资料。 Java是一种广泛使用的面向对象的...

Global site tag (gtag.js) - Google Analytics