文件访问在Java对象上同步
我有一个对象负责持久化JTable状态到磁盘.它保存/加载可见列,它们的大小,位置等.其类定义中的一些有趣的位如下.
class TableSaver { Timer timer = new Timer(true); TableSaver() { timer.schedule(new TableSaverTimerTask(),15000,SAVE_STATE_PERIOD); } synchronized TableColumns load(PersistentTable table) { String xml = loadFile(table.getTableKey()); // parse XML,return } synchronized void save(String key,TableColumns value) { try { // Some preparations writeFile(app.getTableConfigFileName(key),xml); } catch (Exception e) { // ... handle } } private class TableSaverTimerTask extends TimerTask { @Override public void run() { synchronized (TableSaver.this) { Iterator<PersistentTable> iterator = queue.iterator(); while (iterator.hasNext()) { PersistentTable table = iterator.next(); if (table.getTableKey() != null) { save(table.getTableKey(),dumpState(table)); } iterator.remove(); } } } } } >只存在一个TableSaver实例. 有时这样会失败,例如: java.lang.RuntimeException: java.io.FileNotFoundException: C:pathtotable-MyTable.xml (The requested operation cannot be performed on a file with a user-mapped section open) at package.FileUtil.writeFile(FileUtil.java:33) at package.TableSaver.save(TableSaver.java:175) at package.TableSaver.access$600(TableSaver.java:34) at package.TableSaver$TableSaverTimerTask.run(TableSaver.java:246) at java.util.TimerThread.mainLoop(Unknown Source) at java.util.TimerThread.run(Unknown Source) Caused by: java.io.FileNotFoundException: C:pathtotable-MyTable.xml (The requested operation cannot be performed on a file with a user-mapped section open) at java.io.FileOutputStream.open(Native Method) at java.io.FileOutputStream.<init>(Unknown Source) at java.io.FileOutputStream.<init>(Unknown Source) at package.FileUtilWorker.writeFile(FileUtilWorker.java:57) ... 6 more 所以我有两个问题: >这种同步怎么会失败?请注意,我确定只有一个TableSaver实例. 解决方法
Google了解我,这似乎是Windows具体的.以下是
Bug 6354433的摘录:
你使用什么Java / Windows版本?它有最新的更新吗? 这里有两个相关的错误,有一些有用的见解: > Bug 4715154 – 无法删除内存映射文件. 至于你的第二个问题,那就是内部或者匿名类的自动生成的类名. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |