`

java filechannel

    博客分类:
  • java
阅读更多

Java NIO中的FileChannel是一个连接到文件的通道。可以通过文件通道读写文件。

FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下。

filechannel map方法 ,kafka里的index用的mbb实现,文件与内存同步

 

	public static MappedByteBuffer generateChannelMap(String filepath) throws IOException{
		File f = new File(filepath);
		boolean isnew = f.createNewFile();
		System.out.println(isnew);
		RandomAccessFile raf=null;
		MappedByteBuffer mbb=null;
		try {
			raf = new RandomAccessFile(f, "rw");
			mbb = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1024*1024);
		} finally{
			if(raf!=null)
				raf.close();
		}
		return mbb;
	}
 
bytebuffer

 

rewind是limit已经在合适的位置,position=0
flip是limit设置为position,position=0

 

打开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按行读取大文件并解析入库

    为了高效地处理这类问题,我们可以利用Java的`java.nio`包中的BufferedReader和FileChannel等类,实现按行读取大文件,并将其内容解析后存储到数据库中。本文将详细讲解这一过程。 首先,我们需要了解`java.nio`包...

    【IT十八掌徐培成】Java基础第26天-06.FileChannel-RandomAccessFile-CopyFile.zip

    在Java编程语言中,`FileChannel`和`RandomAccessFile`是两个重要的I/O类,它们主要用于处理磁盘文件。这两个类提供了高级的文件操作功能,例如高效的数据传输和随机访问文件内容。在这个主题中,我们将深入探讨这两...

    JAVA 上传音乐

    在Java编程语言中,上传音乐涉及的主要知识点是IO流(Input/Output Stream)的使用,特别是对于大文件如音乐的高效处理。IO流是Java中处理数据传输的核心机制,允许程序读取或写入数据到各种来源,如硬盘、网络、...

    java高速文件缓存

    Java.nio提供了内存映射文件的功能,通过FileChannel的map方法,可以将文件直接映射到内存中,这样文件操作就像操作内存一样高效。这种方式适用于大文件缓存,但需要注意内存占用问题。 ```java FileChannel ...

    JAVA读写二进制文件

    对于大文件,`java.nio` 包中的 `FileChannel` 提供了高效且内存友好的读写方式。例如: ```java FileChannel inChannel = FileChannel.open(Paths.get("binaryfile.bin"), StandardOpenOption.READ); ...

    java NIO原理和使用

    下面是一个简单的 Java NIO 示例,展示了如何使用 `FileChannel` 和 `ByteBuffer` 进行文件复制: ```java package nio; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio....

    读大文件Java

    在Java编程语言中,处理大文件是一项常见的任务,特别是在数据处理、日志分析或大数据应用场景中。"读大文件Java"这个主题主要关注如何高效、安全地读取那些可能超过内存容量的大文件。这里我们将深入探讨Java中几种...

    java 读取文件方法的总结

    Java 读取文件的方法在Java编程中至关重要,无论是处理文本文件、二进制文件还是其他类型的数据,都需要灵活运用各种读取方式。以下是对Java读取文件的五种方法的详细说明,每种方法都有相应的代码示例: 1. **按...

    深入Java NIO:释放IO性能的新维度

    ### 深入Java NIO:释放IO性能的新维度 #### 一、Java NIO的革新特性 ##### 1. 非阻塞 I/O 操作 非阻塞I/O操作是NIO的一个核心特性,它与传统的阻塞式I/O相比,在性能上有了质的飞跃。在传统的阻塞式I/O模型中,当...

    filecopy.java

    在Java编程语言中,文件操作是一项基础且重要的任务。标题为"filecopy.java"的代码示例可能涉及到了文件的复制操作,这是通过利用不同类型的流来实现的。流是Java中处理输入/输出(I/O)的核心概念,它允许程序读取...

    Java NIO 细节也精彩

    ### Java NIO 的精彩细节解析 #### 一、Selector的Wakeup原理 ##### 1.1 背景介绍 在Java NIO (Non-blocking I/O)中,`Selector` 是核心组件之一,用于监控多个`Channel`上的I/O事件(如可读、可写等)。`...

    有效率的读取大文件(2G)

    FileChannel channel = FileChannel.open(Paths.get("largefile.txt")); ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024); // 分配1MB的DirectByteBuffer while (channel.read(buffer) > 0) { buffer....

    NIO处理大文件

    在Java编程中,传统的I/O模型(Input/Output)在处理大文件时可能会遇到性能瓶颈,因为它们基于阻塞I/O操作,会消耗大量的系统资源并可能导致线程阻塞。为了解决这个问题,Java引入了New Input/Output (NIO) 模型,...

    IO文件读取

    我们将重点关注Java语言,因为它是广泛使用的且具有丰富的IO库。 首先,我们来了解IO的基本概念。IO是指计算机系统与外部设备之间交换数据的过程,如硬盘、键盘、显示器等。在文件读取场景中,我们通常涉及从磁盘...

    android开发进阶之NIO非阻塞包

    5. **FileChannel和SocketChannel的应用**:`FileChannel`用于文件I/O操作,它允许直接从文件读取数据或将数据直接写入文件,减少了内存拷贝带来的性能损失。而`SocketChannel`则用于网络通信,支持客户端和服务端...

    Android开发之-SD卡的使用.zip

    FileChannel destination = new FileOutputStream(destFile).getChannel(); source.transferTo(0, source.size(), destination); source.close(); destination.close(); ``` - 文件删除: ```java file.delete(); ``...

    多线程下载实例

    outputChannel = FileChannel.open(file2.toPath(), StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW); outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); // 合并其他部分文件... }...

    muyinchen#woker#07 Java的NIO之FileChannel1

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

    java 深入理解内存映射文件原理

    内存映射文件是Java和其他编程语言中的一种高效的数据访问机制,尤其在处理大文件和进行进程间通信时表现优越。本文将深入探讨内存映射文件的原理、与虚拟内存的区别和联系,以及它们的效率差异。 虚拟内存和内存...

    Java之单例模式&&NIO

    Java中的单例模式是一种设计模式,它用于保证一个类只有一个实例,并提供一个全局访问点。在给定的代码示例中,我们看到了两种常见的单例实现方式:懒汉式和饿汉式。 **懒汉式单例模式**: 懒汉式单例的特点是延迟...

Global site tag (gtag.js) - Google Analytics