どうしてもNIO2が使えないのでムシャクシャしてやった

仕事でですが、どうしてもJava6の環境で、ファイルの更新管理をするライブラリを作らなきゃいけなかったので、Apache Commons IO使って作ってみた。

github.com

参考にしたのはここです。 ありがとうございました。

qiita.com

実際に使うときはもっと修正していますが、サンプルにどうぞ。

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);
    }
}