私のアプリでは、一意の ID が生成される前に生成されたかどうかを確認し、生成されていない場合は生成してファイルに書き込みます。しかし、複数プロセスのアプリでは、複数のプロセスが同じファイルに書き込もうとすると、以前に生成された uid がないことがわかった場合に問題があると感じます。
Androidでは、複数のプロセスが同じファイルに書き込むのを防ぐ方法は?
私のアプリでは、一意の ID が生成される前に生成されたかどうかを確認し、生成されていない場合は生成してファイルに書き込みます。しかし、複数プロセスのアプリでは、複数のプロセスが同じファイルに書き込もうとすると、以前に生成された uid がないことがわかった場合に問題があると感じます。
Androidでは、複数のプロセスが同じファイルに書き込むのを防ぐ方法は?
Android では、FileLock を使用してファイルをロックし、別のプロセスがそのファイルに書き込めないようにすることができます。
ファイル ロックは次のいずれかになります。排他的または共有
Shared : 複数のプロセスが、1 つのファイルの同じ領域で共有ロックを保持できます。
Exclusive : 1 つのプロセスのみが排他ロックを保持できます。他のプロセスは、排他ロックと重複する共有ロックを同時に保持することはできません。
final boolean isShared() : check wheather the file lock is shared or exclusive.
final long position() : lock's starting position in the file is returned.
abstract void release() : releases the lock on the file.
final long size() : returns length of the file that is locked.
次の例は、ファイルをロックし、操作を実行した後に解放する方法についての疑問を解消します。
public void testMethod() throws IOException,NullPointerException{
String fileName="textFile.txt";
String fileBody="write this string to the file";
File root;
File textFile=null;
//create one file inside /sdcard/directoryName/
try
{
root = new File(Environment.getExternalStorageDirectory(),"directoryName");
if (!root.exists()) {
root.mkdirs();
}
textFile = new File(root, fileName);
FileWriter writer = new FileWriter(textFile);
writer.append(fileBody);
writer.flush();
writer.close();
System.out.println("file is created and saved");
}
catch(IOException e)
{
e.printStackTrace();
}
//file created. Now take lock on the file
RandomAccessFile rFile=new RandomAccessFile(textFile,"rw");
FileChannel fc = rFile.getChannel();
FileLock lock = fc.lock(10,20, false);
System.out.println("got the lock");
//wait for some time and release the lock
try { Thread.sleep(4000); } catch (InterruptedException e) {}
lock.release();
System.out.println("released ");
rFile.close();
}