Java 尝试锁定文件以进行读取时的失望
我试图让每个线程读取自己的txt文件Java 尝试锁定文件以进行读取时的失望,java,multithreading,Java,Multithreading,我试图让每个线程读取自己的txt文件 private void burden() { File mainFolder = new File("C:\\FilesToRead"); File[] files = mainFolder.listFiles(); String freeFile; for (File file : files) { FileChannel channel; FileLock lock = nul
private void burden() {
File mainFolder = new File("C:\\FilesToRead");
File[] files = mainFolder.listFiles();
String freeFile;
for (File file : files) {
FileChannel channel;
FileLock lock = null;
try {
channel = new RandomAccessFile(file, "r").getChannel();;
lock = channel.lock();
// Ok. We get the lock
readFile(file.getName());
} catch (OverlappingFileLockException e) {
continue; // File is open by someone else
} catch (FileNotFoundException f) {
} catch (IOException ex) {
} catch (NonWritableChannelException n) {
System.out.println("NonWritableChannelException");
} finally {
try {
lock.release();
} catch (IOException ex) {
System.out.println("IOException!");
}
}
}
} // burden();
我在调试器中看到以下图片:
下一步将介绍NonWritableChannelException
当我试图锁定文件以便阅读时,我不明白为什么。
任何帮助都将不胜感激。javadoc给出了答案。使用
.lock()
,这相当于调用.lock(0L,Long.MAX\u值,false)
第三个参数是布尔值,描述为(emphasis mine):
如果为true,则请求共享锁,在这种情况下,此通道必须打开以进行读取(可能还包括写入)false请求独占锁,在这种情况下,必须打开此通道以进行写入(也可能进行读取)
您必须.lock(0L,Long.MAX\u值,true)
另外,如果您使用的是Java 7,请使用
FileChannel.open()
您还需要在此处锁定可写通道,以便生成代码
channel = new RandomAccessFile(file, "rw").getChannel();
这应该会起作用。您应该显示异常。不要吞咽异常。某些outputstreams可能会修改此文件。因此也需要消除这种情况。锁仍然是建议性的;即使您有一个锁,也不会阻止另一个程序,甚至是当前JVM的线程打开文件进行写入。