package com.dgex.offspring.application.utils; import java.io.File; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class FileWatcher { /* Singleton class - use as FileWatcher.getInstance() */ private static FileWatcher INSTANCE = null; private List<FileWatcherStruct> listeners; private ScheduledExecutorService scheduler; private class FileWatcherStruct { public String path; public FileWatcherListener listener; public long mostRecentByteCount; public FileWatcherStruct(String path, FileWatcherListener listener) { this.path = path; this.listener = listener; this.mostRecentByteCount = 0; } } public FileWatcher() { listeners = new ArrayList<FileWatcherStruct>(); scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleWithFixedDelay(new Runnable() { public void run() { for (int i = 0; i < listeners.size(); i++) { FileWatcherStruct s = listeners.get(i); File file = new File(s.path); if (!file.exists()) { s.listener.fileChanged(readableFileSize(0)); } else { long size = file.length(); if (size != s.mostRecentByteCount) { s.mostRecentByteCount = size; s.listener.fileChanged(readableFileSize(size)); } } } } }, 1, 500, TimeUnit.MILLISECONDS); }; public static FileWatcher getInstance() { if (INSTANCE == null) { INSTANCE = new FileWatcher(); } return INSTANCE; } private String readableFileSize(long size) { if (size <= 0) { return "0"; } final String[] units = new String[] { "B", "KB", "MB", "GB", "TB" }; int digitGroups = (int) (Math.log10(size) / Math.log10(1024)); return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups]; } public void addListener(String path, FileWatcherListener listener) { for (int i = 0; i < listeners.size(); i++) { FileWatcherStruct s = listeners.get(i); if (s.path.equals(path) && s.listener == listener) { return; // allready registered } } listeners.add(new FileWatcherStruct(path, listener)); } public void removeListener(String path, FileWatcherListener listener) { for (int i = 0; i < listeners.size(); i++) { FileWatcherStruct s = listeners.get(i); if (s.path.equals(path) && s.listener == listener) { listeners.remove(i); return; } } } }