sesfei
发贴: 1
积分: 0
|
于 2008-08-29 11:58
近日在项目中遇到这样的问题,求大虾助战 【课题】: 2个不同的WEB项目,共用同一个XML文件。如果项目1先更新了XML,项目2取得最新的XML内容显示在页面上; 同样,如果项目2更新了XML,项目1取得最新的XML内容显示在页面上。 【实现】: XML读操作,对XML文件锁FileLock,读完后文件锁解除。 XML写操作,对XML文件锁FileLock,读完后文件锁解除。 文件锁状态判断: 文件锁存在,该线程200毫秒Sleep,直到解锁后,读写操作才可进行。 【问题】: XML读写操作之前,文件锁启用,但是XML文件读操作用编码器XMLDecoder,写操作用解码器XMLEncoder,在文件锁启用之后使用是,出错。 【代码】:
public class XMLUtil { /** * XML读操作 */ public static Object xmlReader(String fileName) { if (!new File(fileName).exists()) { return null; } XMLDecoder decoder = null; Object obj = null; try { // 文件锁 FileLock lock = new RandomAccessFile(fileName, "rw").getChannel().tryLock(); while (lock == null || (lock !=null && !lock.isValid())){ Thread.sleep(200L); lock = new RandomAccessFile(fileName, "rw").getChannel().tryLock(); } FileInputStream fis = new FileInputStream(fileName); BufferedInputStream bis = new BufferedInputStream(fis); decoder = new XMLDecoder(bis); obj = decoder.readObject(); //出错!!! decoder.close(); bis.close(); fis.close(); // 文件锁 lock.release(); } catch (IOException ioe) { System.out.println("err"); } catch (InterruptedException e) { System.out.println("sleep err"); } finally { if (null != decoder) { decoder.close(); } } return obj; }
/** * XML写操作 */ public static void xmlWriter(Object bean, String fileName) { if (!new File(fileName).exists()) { return; } XMLEncoder encoder = null; try { // 文件锁 FileLock lock = new RandomAccessFile(fileName, "rw").getChannel().tryLock(); while (lock == null || (lock !=null && !lock.isValid())){ Thread.sleep(200L); lock = new RandomAccessFile(fileName, "rw").getChannel().tryLock(); } FileOutputStream fos = new FileOutputStream(fileName); BufferedOutputStream bos = new BufferedOutputStream(fos); encoder = new XMLEncoder(bos); encoder.writeObject(bean); encoder.flush(); //出错!!! encoder.close(); bos.close(); fos.close(); // 文件锁 lock.release(); } catch (IOException exc) { System.out.println("err"); } catch (InterruptedException e) { System.out.println("sleep err"); } finally { if (null != encoder) { encoder.close(); } } }
}
|