どうしてもNIO2が使えないのでムシャクシャしてやった
仕事でですが、どうしてもJava6の環境で、ファイルの更新管理をするライブラリを作らなきゃいけなかったので、Apache Commons IO使って作ってみた。
参考にしたのはここです。 ありがとうございました。
実際に使うときはもっと修正していますが、サンプルにどうぞ。
ResourceMonitor
package sample.file.monitor.monitor; import java.io.File; import java.io.FileFilter; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.io.monitor.FileAlterationMonitor; import org.apache.commons.io.monitor.FileAlterationObserver; import org.apache.log4j.Logger; import sample.file.monitor.listner.ResourceListner; import sample.file.monitor.resource.Resource; /** * * @author yushi.koga */ public class ResourceMonitor { static private final ResourceMonitor resourceMonitor = new ResourceMonitor(); static private final Logger log = Logger.getLogger(ResourceMonitor.class); private long refreshDelay = 4000L; private URI monitoringDirectory = null; static private final String MONITORING_FILE = "target.txt"; public static ResourceMonitor getInstance() { return resourceMonitor; } public void setRefreshDelay(long refreshDelay) { this.refreshDelay = refreshDelay; } public void setMonitoringDirectory(URI monitoringDirectory) throws URISyntaxException, MalformedURLException { this.monitoringDirectory = monitoringDirectory; } private ResourceMonitor() { } public void start() throws ConfigurationException, MalformedURLException, Exception { // Guard Clause if (monitoringDirectory == null) { throw new IllegalStateException("Please set monitoring directory"); } // Generate Monitor. Interval is milli seconds. FileAlterationMonitor monitor = new FileAlterationMonitor(refreshDelay); // Generate Observer.Set monitoring directory. final File dir = new File(monitoringDirectory); FileFilter filter = new FileFilter() { @Override public boolean accept(File pathname) { return pathname.getName().equals(MONITORING_FILE); } }; FileAlterationObserver observer = new FileAlterationObserver(dir, filter); // Generate and register Lister to Observer ResourceListner listener = new ResourceListner(); observer.addListener(listener); // Register Observer to Monitor monitor.addObserver(observer); // Start Monitor Resource.load(new URL(monitoringDirectory.toURL(), MONITORING_FILE)); monitor.start(); log.info(this.getClass().getSimpleName() + " started monitoring"); } }
ResourceListner
package sample.file.monitor.listner; import java.io.File; import java.net.MalformedURLException; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import org.apache.log4j.Logger; import sample.file.monitor.resource.Resource; /** * * @author yushi.koga */ public class ResourceListner extends FileAlterationListenerAdaptor { private final Logger log = Logger.getLogger(ResourceListner.class); private void load(File file, String event) { try { Resource.load(file.toURI().toURL()); } catch (MalformedURLException ex) { log.error(file.getName() + "is " + event + "but failed to load ", ex); } catch (ConfigurationException ex) { log.error(file.getName() + "is " + event + "but failed to load ", ex); } } @Override public void onFileChange(File file) { log.info(file.getName() + "is updated"); load(file, "updated"); } @Override public void onFileCreate(File file) { log.info(file.getName() + "is created"); load(file, "created"); } @Override public void onFileDelete(File file) { log.info(file.getName() + "is deleted"); } }
Resource
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package sample.file.monitor.resource; import java.net.URL; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.log4j.Logger; /** * * @author yushi.koga */ public class Resource { static private final Resource resource = new Resource(); static private final Logger log = Logger.getLogger(Resource.class); static private PropertiesConfiguration configuration; private Resource() { } public static Resource getInstance() { return resource; } public static void load(URL resourceFile) throws ConfigurationException{ try { configuration = new PropertiesConfiguration(resourceFile); } catch (ConfigurationException ex) { log.error("failde to load " + resourceFile.toString(),ex); throw new ConfigurationException(ex); } } public String getString(String key) { return configuration.getString(key); } public int getInt(String key) { return configuration.getInt(key); } public long getLong(String key) { return configuration.getLong(key); } }