我正在尝试让每个线程都读取自己的txt文件。
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。
我无法理解为什么我试图锁定文件进行阅读。 任何帮助都将受到高度赞赏。
答案 0 :(得分:1)
javadoc给出答案。您使用.lock()
,这相当于调用.lock(0L, Long.MAX_VALUE, false)
。
第三个参数,一个布尔值,被描述为(强调我的):
如果要求共享锁,则为true,在这种情况下,必须打开此通道才能读取(并可能写入); false 请求独占锁定,在这种情况下此频道必须打开才能写入(并可能会阅读)
您必须.lock(0L, Long.MAX_VALUE, true)
此外,如果您使用的是Java 7,请使用FileChannel.open()
答案 1 :(得分:0)
你还需要在这里锁定可写通道,以便制作你的代码,
channel = new RandomAccessFile(file, "rw").getChannel();
这应该有用。