public class AtomicFile extends Object
AtomicFile
,
a helper class for performing atomic operations on a file by creating a
backup file until a write has successfully completed.
Atomic file guarantees file integrity by ensuring that a file has been completely written and sync'd to disk before removing its backup. As long as the backup file exists, the original file is considered to be invalid (left over from a previous attempt to write the file).
Atomic file does not confer any file locking semantics. Do not use this class when the file may be accessed or modified concurrently by multiple threads or processes. The caller is responsible for ensuring appropriate mutual exclusion invariants whenever it accesses the file.
Constructor and Description |
---|
AtomicFile(File baseName)
Create a new AtomicFile for a file located at the given File path.
|
Modifier and Type | Method and Description |
---|---|
void |
delete()
Delete the atomic file.
|
void |
failWrite(FileOutputStream str)
Call when you have failed for some reason at writing to the stream
returned by
startWrite() . |
void |
finishWrite(FileOutputStream str)
Call when you have successfully finished writing to the stream
returned by
startWrite() . |
File |
getBaseFile()
Return the path to the base file.
|
FileInputStream |
openRead()
Open the atomic file for reading.
|
byte[] |
readFully()
A convenience for
openRead() that also reads all of the
file contents into a byte array which is returned. |
FileOutputStream |
startWrite()
Start a new write operation on the file.
|
public AtomicFile(File baseName)
public File getBaseFile()
public void delete()
public FileOutputStream startWrite() throws IOException
finishWrite(FileOutputStream)
or failWrite(FileOutputStream)
.
Note that if another thread is currently performing a write, this will simply replace whatever that thread is writing with the new file being written by this thread, and when the other thread finishes the write the new write operation will no longer be safe (or will be lost). You must do your own threading protection for access to AtomicFile.
IOException
public void finishWrite(FileOutputStream str)
startWrite()
. This will close, sync, and
commit the new data. The next attempt to read the atomic file
will return the new file stream.public void failWrite(FileOutputStream str)
startWrite()
. This will close the current
write stream, and roll back to the previous state of the file.public FileInputStream openRead() throws FileNotFoundException
Note that if another thread is currently performing a write, this will incorrectly consider it to be in the state of a bad write and roll back, causing the new data currently being written to be dropped. You must do your own threading protection for access to AtomicFile.
FileNotFoundException
public byte[] readFully() throws IOException
openRead()
that also reads all of the
file contents into a byte array which is returned.IOException