2011-11-07 81 views
2

我需要在一个临时文件中写入一些数据,这个文件存储在一个目录答:我用File.createTempFile方法来做到这一点。但是,有一个线程会定期轮询目录A以检查是否有临时文件需要处理。设置文件不可读

// create a temporary file that will contain the data 
newTmpFile = File.createTempFile("prefix", recoverFileExt, new File(
       recoverDirectory)); 
// the file is set to non readable, so the recovery thread cannot 
// access it 
newTmpFile.setReadable(false); 

//write data into the file 

// the file is written, it is set to readable so the recovery thread 
// can now access it 
newTmpFile.setReadable(true); 

的问题是,我不想做写入操作之前,恢复线程访问该文件。所以,我使用这种机制:我创建该文件,将其设置为不可读,写入,然后将其设置为可读并关闭它。问题是,在文件创建后,文件仍然可读,线程可以访问它。

所以,我想知道是否有设置该文件作为非可读在其创建的可能性,或者如果你有其他的解决方案。

感谢

回答

5

我的建议是,首先给文件一个不同的名称(例如,使用不同的前缀),它已经写入后重新命名。

这样的恢复线程可以partially-和完全写入的文件区分,只有处理后者。

+0

另请注意,如果目录位于同一文件系统上,则可以在目录之间快速重命名文件。 (这不是NFS推荐的,但NFS并不真正用于“数据完整性”。) –

+0

我接受其设施的答案。但是,我知道使用文件名进行同步不是一个好习惯。 –

0

恕我直言,这不是做它的方式。使用信号/互斥来控制线程同步。尝试使用文件同步线程是一个坏习惯,并且会在稍后导致更多的错误。

0

创建的文件

你不应该使用的文件系统,因为以这种方式锁定机制的指数。具有不同文件名的Aix解决方案可以工作,但并不理想。

一个更好的解决办法是在内存中加载的地方,两个线程可以访问文件的索引。任何时候当你创建一个文件进行处理时,一旦完成并准备好处理,将它添加到索引中。然后恢复线程只会访问它在索引中给出的文件来处理。

该指数将有效地为恢复线程工作队列。

0

我会通过创建具有该线程将忽略的特殊名称的文件来绕过它。然后,您首先将其重命名,然后将其更改为可读。所以,你将有两个检查 - 该文件是不可读的,以及它是否有一个特殊的名字..

0

如果线程在同一过程中,你可以保持它控制了多少数据已经安全写入的计数器。这使您可以在写入恢复日志时尽快处理日志。