package com.cwa.qiji; import java.io.*; import java.util.List; import org.apache.log4j.Logger; /** * 用磁盘文件保存和加载ActiveUserPool。 */ class FileActiveUserStore implements ActiveUserStore { private static final Logger logger = Logger.getLogger(FileActiveUserStore.class); private String fileName; public FileActiveUserStore(String fileName) { this.fileName = fileName; } // 把活跃玩家写入磁盘。 @Override public void save(ActiveUserCache pool) { DataOutputStream out = null; try { out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileName))); save(pool, out); } catch (IOException e) { logger.error("Error while saving ActiveUserPool.", e); } finally { if (out != null) { try { out.close(); } catch (IOException e) { logger.error("Can not close OutputStream.", e); } } } } private void save(ActiveUserCache pool, DataOutputStream out) throws IOException { for (int i = 0; i < pool.getPages().length; i++) { ActiveUserCachePage page = pool.getPages()[i]; List<Integer> ids = page.getAllUsers(); out.writeInt(ids.size()); for (Integer id : ids) { out.writeInt(id); } } } // 从磁盘文件中读活跃玩家。 @Override public void load(ActiveUserCache pool) { File dataFile = new File(fileName); if (! dataFile.exists()) { // 文件不存在 return; } DataInputStream in = null; try { in = new DataInputStream(new BufferedInputStream(new FileInputStream(dataFile))); load(pool, in); } catch (IOException e) { logger.error("Error while loading ActiveUserPool.", e); } finally { if (in != null) { try { in.close(); } catch (IOException e) { logger.error("Can not close InputStream.", e); } } } } private void load(ActiveUserCache pool, DataInputStream in) throws IOException { for (int i = 0; i < pool.getPages().length; i++) { ActiveUserCachePage page = pool.getPages()[i]; int userCount = in.readInt(); for (int j = 0; j < userCount; j++) { int id = in.readInt(); page.update(id); } } } }