目录
一、FileChannel
1. 打开 FileChannel
2. 读取数据到 ByteBuffer
3. 写入数据到 FileChannel
4. 文件位置操作
5. 文件截取
6. 强制刷新
7. 关闭 FileChannel
二、FileChannel 读取文件内容
Java NIO(New I/O)是 Java 1.4 引入的一组提供更强大、更灵活的 I/O 操作的 API。它主要包括 java.nio
包,其中的核心组件是 java.nio.channels
和 java.nio.file
。
一、FileChannel
FileChannel
是 Java NIO 中用于读取和写入文件的通道。它是 java.nio.channels
包中的一个接口,提供了一些方法,使得对文件进行读写变得更为灵活。以下是一些 FileChannel
的常用操作:
1. 打开 FileChannel
你可以使用 RandomAccessFile
或者 FileInputStream
/ FileOutputStream
来获取一个 FileChannel
对象。
使用 RandomAccessFile
:
RandomAccessFile file = new RandomAccessFile("example.txt", "rw");
FileChannel channel = file.getChannel();
使用 FileInputStream
和 FileOutputStream
:
FileInputStream fis = new FileInputStream("example.txt");
FileChannel inputChannel = fis.getChannel();
FileOutputStream fos = new FileOutputStream("output.txt");
FileChannel outputChannel = fos.getChannel();
2. 读取数据到 ByteBuffer
使用 read()
方法可以将数据从 FileChannel
读取到 ByteBuffer
中。
ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = channel.read(buffer);
3. 写入数据到 FileChannel
使用 write()
方法可以将数据从 ByteBuffer
写入到 FileChannel
。
ByteBuffer buffer = ByteBuffer.wrap("Hello, World!".getBytes());
int bytesWritten = channel.write(buffer);
4. 文件位置操作
FileChannel
维护一个当前位置(position),读写操作都是从当前位置开始的。在读写之后,位置会自动更新。
long currentPosition = channel.position(); // 获取当前位置
channel.position(newPosition); // 设置新的位置
channel.position(channel.size()); // 将位置设置到文件末尾
5. 文件截取
truncate()
方法可以截取文件的长度。截取文件后,文件的大小将被截短,多余的部分被删除。
channel.truncate(newSize);
6. 强制刷新
force()
方法可以强制将文件的所有修改写入磁盘。
channel.force(true); // 强制将文件的所有修改写入磁盘
7. 关闭 FileChannel
使用 close()
方法关闭 FileChannel
。
channel.close();
二、FileChannel
读取文件内容
使用FileChannel读取文件内容
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;public class FileChannelExample {public static void main(String[] args) {try {// 打开文件通道RandomAccessFile file = new RandomAccessFile("example.txt", "r");FileChannel channel = file.getChannel();// 创建缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);// 从通道读取数据到缓冲区int bytesRead = channel.read(buffer);while (bytesRead != -1) {System.out.println("Read " + bytesRead + " bytes.");// 切换缓冲区为读模式buffer.flip();// 读取缓冲区中的数据while (buffer.hasRemaining()) {System.out.print((char) buffer.get());}// 清空缓冲区buffer.clear();// 继续从通道读取数据到缓冲区bytesRead = channel.read(buffer);}// 关闭通道和文件channel.close();file.close();} catch (Exception e) {e.printStackTrace();}}
}
这个示例打开一个文件通道,然后使用 ByteBuffer
缓冲区从文件中读取数据。读取后,缓冲区切换为读模式,然后逐个字节输出。