ObjectInputStream 在 filelock 锁定部分内抛出 ioexception
ObjectInputStream throws ioexception inside the filelock lock section
我有一个函数,必须将键值对放入存储在文件中的映射中。如果文件不存在,我必须创建它。当我使用 Filelock lock() 处理文件时,我尝试锁定该文件。但是当我尝试写入它时(在锁定部分内),我得到 IO 异常:
Suppressed: java.io.IOException: 该进程无法访问该文件,因为另一个进程已锁定该文件的一部分
我可能不会正确使用 lock() 。这是我的功能:
private void createDataSet(String key, String data) throws IOException, ClassNotFoundException{
final String path = (fileName);
// 1. Check if file exists
// 2. If file exists, write/override key/value.
Path nPath = Paths.get(path);
HashMap<String, List<String>> map = new HashMap<String, List<String>>();
// createFile is atomic, no need to check if exists.
try(FileChannel fileChannel = FileChannel.open(nPath,StandardOpenOption.WRITE,StandardOpenOption.APPEND
, StandardOpenOption.CREATE);
FileOutputStream fos= new FileOutputStream(path, false);
ObjectOutputStream oos= new ObjectOutputStream(fos);
){
FileLock lock = fileChannel.lock();
if(fileChannel.size()==4){
map.put(key, values);
oos.writeObject(map);
}else{
ObjectInputStream objectIn = new ObjectInputStream(Channels.newInputStream(fileChannel));
Object obj = objectIn.readObject();
map = (HashMap<String, List<String>>) obj;
map.put(key, values);
// In this row exception being throwed:
oos.writeObject(map);
}
oos.close();
fos.close();
lock.release();
}
return;
您打开文件两次 - 一次通过 FileChannel
,另一次通过 FileOutputStream
。然后您通过 FileChannel
锁定文件,但尝试通过 FileOutputStream
写入文件。这就是为什么流被通道锁阻塞的原因。
FileChannel
有自己的 read/write 方法。使用频道或流,但不能同时使用。
[编辑]文件锁是为了防止另一个进程写入它,所以除非你知道有一些其他进程可能会尝试写入你的文件,否则通常不需要在之前显式锁定文件写入它。
我有一个函数,必须将键值对放入存储在文件中的映射中。如果文件不存在,我必须创建它。当我使用 Filelock lock() 处理文件时,我尝试锁定该文件。但是当我尝试写入它时(在锁定部分内),我得到 IO 异常: Suppressed: java.io.IOException: 该进程无法访问该文件,因为另一个进程已锁定该文件的一部分 我可能不会正确使用 lock() 。这是我的功能:
private void createDataSet(String key, String data) throws IOException, ClassNotFoundException{
final String path = (fileName);
// 1. Check if file exists
// 2. If file exists, write/override key/value.
Path nPath = Paths.get(path);
HashMap<String, List<String>> map = new HashMap<String, List<String>>();
// createFile is atomic, no need to check if exists.
try(FileChannel fileChannel = FileChannel.open(nPath,StandardOpenOption.WRITE,StandardOpenOption.APPEND
, StandardOpenOption.CREATE);
FileOutputStream fos= new FileOutputStream(path, false);
ObjectOutputStream oos= new ObjectOutputStream(fos);
){
FileLock lock = fileChannel.lock();
if(fileChannel.size()==4){
map.put(key, values);
oos.writeObject(map);
}else{
ObjectInputStream objectIn = new ObjectInputStream(Channels.newInputStream(fileChannel));
Object obj = objectIn.readObject();
map = (HashMap<String, List<String>>) obj;
map.put(key, values);
// In this row exception being throwed:
oos.writeObject(map);
}
oos.close();
fos.close();
lock.release();
}
return;
您打开文件两次 - 一次通过 FileChannel
,另一次通过 FileOutputStream
。然后您通过 FileChannel
锁定文件,但尝试通过 FileOutputStream
写入文件。这就是为什么流被通道锁阻塞的原因。
FileChannel
有自己的 read/write 方法。使用频道或流,但不能同时使用。
[编辑]文件锁是为了防止另一个进程写入它,所以除非你知道有一些其他进程可能会尝试写入你的文件,否则通常不需要在之前显式锁定文件写入它。