Archive for the ‘Android’ Category
RandomAccessFile does not lock your file by default
If you use this class for writing then you probably want to ensure that you are the only one who is allowed to modify given file. I recently was fixing code that used RandomAccessFile for writing huge files downloaded from internet, but it didnt lock those file during writing. Whats wrong with that? Actually from the user perspective nothing, those file wont be accessed any way by any other software, but what we are missing here is the fact that only one thread should be allowed to read/write those files is an invariant which should be checked in code to trap any errors that could show up. And if this invariant were checked in the code I was fixing, developer would find his bug much earlier.
In todays heavily multithreaded environments it is easy to introduce errors, thats why invariants should be checked whether possible and exceptions should be thrown always when they are not correctly met.
Below is a small method for checking if file is locked or not.
public static boolean isFileLocked(File f) { RandomAccessFile file = null; FileChannel fileChannel = null; FileLock fileLock = null; try { file = new RandomAccessFile(f, "r"); fileChannel = file.getChannel(); if (fileChannel == null) return false; fileLock = fileChannel.lock(); } catch (FileNotFoundException fnfe) { return false; } catch (Exception e) { // ClosedChannelException // NonWritableChannelException // OverlappingFileLockException // FileLockInterruptionException // AsynchronousCloseException // IOException return true; } finally { try { if (fileLock != null) fileLock.release(); if (fileChannel != null) fileChannel.close(); if (file != null) file.close(); } catch (IOException ioe) { return false; } } return false; }