FileChannel对RandomAccessFile的行为

时间:2010-10-21 17:54:29

标签: java concurrency nio

我有一个用例,我的多个线程正在将数据写入同一个文件通道(池化),并且每个线程在文件中都有偏移量,从那里开始写入,直到要写入的数据长度。因此,当我从池中询问文件通道时,它将以“rw”模式打开通道,如果它尚未打开并将返回该文件通道(打开的文件可能是新文件,即size = 0),否则它将返回缓存通道。问题是线程可能没有特别写入数据,这意味着具有偏移1,000,000的线程可能在具有偏移0的线程之前开始写入。考虑我打开了一个新文件(size = 0),并且offset = 1,000,000的线程开始写入数据(使用write(buffer, position) API)在使用offset = 0的线程之前。

我的第一个问题:这是否允许,或者我会得到一些例外 其次,如果它允许:什么是保证我的数据正确写入。 第三。当我的(偏移= 1,000,000)写入文件时,空白区域(0-999,999)中的内容是什么。操作系统如何分配这个中间空间?

1 个答案:

答案 0 :(得分:2)

如果没有真正尝试你所描述的内容,这是一个有根据的猜测:

第一个问题:FileChannel是线程安全的,并且有记录可以根据需要扩展文件大小(“当写入超出当前大小的字节时,文件的大小会增加”),所以我认为这是允许的。

第二个问题:无法保证您的数据写得正确;这完全取决于你作为程序员的技能。 :)

第三个问题:我希望“空白空间”的字节内容与操作系统有关,但你可以写一个简单的程序来轻松测试它。