我已经尝试过很多例子,但是没有人能工作。 我尝试这个,但不工作。
我也尝试使用tryLock()
。 它总是返回false。 为什么?
private boolean checkCompleteFile(File f) { RandomAccessFile file = null; FileLock fileLock = null; try { file = new RandomAccessFile(f, "rw"); FileChannel fileChannel = file.getChannel(); fileLock = fileChannel.lock(); if (fileLock != null) { fileLock.release(); file.close(); return false; } } catch(Exception e) { return false; } return true; }
你捕捉到一个异常,并返回false,这就是为什么你一直得到错误,对异常做一些事情,或者不要抓住它,所以你知道是否抛出异常,如果你捕捉到一个普通的异常,一个错误的返回值并不真正有意义。
try { lock = channel.tryLock(); // ... } catch (OverlappingFileLockException e) { // File is already locked in this thread or virtual machine } lock.release(); channel.close();
你只是试图访问该文件,并捕获一个异常,如果它失败:
boolean isLocked=false; RandomAccessFile fos=null; try { File file = new File(filename); if(file.exists()) fos=new RandomAccessFile(file,"rw"); }catch (FileNotFoundException e) { isLocked = true; }catch (SecurityException e) { isLocked = true; }catch (Exception e) { // handle exception }finally { try { if(fos!=null) { fos.close(); } }catch(Exception e) { //handle exception } }
注意RandomAccessFile类抛出:
FileNotFoundException –
如果模式是“r”,但给定的字符串不表示现有的常规文件,或者如果模式以“rw”开始,但给定的字符串不表示现有的可写常规文件,并且该名称的新常规文件不能被创建 ,或者如果在打开或创建文件时发生其他错误。
SecurityException –
如果安全管理器存在并且其checkRead方法拒绝对文件的读取访问,或者模式为“rw”,并且安全管理器的checkWrite方法拒绝对文件的写入访问
如何使用Linux命令?
lsof -p
该命令将显示文件打开状态,您可以解析它来检查谁使用它。
尝试使用这个:
try { @SuppressWarnings("resource") FileChannel channel = new RandomAccessFile(fileToRead, "rw").getChannel(); //This method blocks until it can retrieve the lock. FileLock lock = channel.lock(); // Try acquiring the lock without blocking. try { lock = channel.tryLock(); } catch (OverlappingFileLockException e){ } lock.release(); //close the file. channel.close(); } catch (Exception e) { }