在多个用户操作同1个文件的情况下,可能会造成数据的丢失。显然想实现类似数据库事务的功能,如果用户1的操作成功,则将其到文件中,而如果用户1的操作成功,则进行回滚不写入到文件中。
在多个用户操作同1个文件的情况下,可能会造成数据的丢失。显然想实现类似数据库事务的功能,如果用户1的操作成功,则将其到文件中,而如果用户1的操作成功,则进行回滚不写入到文件中。
加锁:
类似于 数据库加锁的原理:
用memcache 或者 redis 加个内存锁
每次去操作文件的时候 去看看锁有没有被释放,如有有锁 说明已经有用户在操作了
操作完毕 释放锁
// 方案1:利用RandomAccessFile的文件操作选项s,s即表示同步锁方式写
RandomAccessFile file = new RandomAccessFile(file, "rws");
抄来的,原文见:
http://blog.csdn.net/kjfcpua/...
用fileLock会好一点,读锁,写锁全有
`FileOutputStream fo = new FileOutputStream("123.txt");
FileLock lock = fo.getChannel().lock();//写锁 互斥
Writer writer = new OutputStreamWriter(fo);
writer.write("test");
lock.release();
FileInputStream fi = new FileInputStream("123.txt");
lock = fi.getChannel().lock(0, Long.MAX_VALUE, true);//文档从位置0,锁到Long.MAX_VALUE,共享锁,排斥写
BufferedReader reader = new BufferedReader(new InputStreamReader(fi));
reader.readLine();
lock.release();
fi.close();`
try catch自己补全吧
15 回答8.4k 阅读
8 回答6.2k 阅读
3 回答2k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
为什么不直接使用数据库呢,如果你在文件系统上加上事务的功能,相当于你实现了一个乞丐版的数据库。
推荐使用SQlLite嵌入式本地文件数据库,非常轻量级,单文件,完整支持SQL标准