Когда я сталкиваюсь с этим, я просто создаю список на стороне. При соединении их в пользовательской Реализации Map она будет иметь хорошее чувство к нему... Можно использовать что-то как следующее, выполняя вид только при необходимости. (Отметьте: Я действительно не протестировал это, но это компилирует... могла бы быть глупая небольшая ошибка там где-нибудь)
(Если Вы хотите отсортированный и по ключам и по значениям, имеете класс, расширяют TreeMap, не определяйте методы доступа и имейте мутаторный вызов super.xxxxx вместо map_. xxxx)
package com.javadude.sample;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SortedValueHashMap<K, V> implements Map<K, V> {
private Map<K, V> map_ = new HashMap<K, V>();
private List<V> valueList_ = new ArrayList<V>();
private boolean needsSort_ = false;
private Comparator<V> comparator_;
public SortedValueHashMap() {
}
public SortedValueHashMap(List<V> valueList) {
valueList_ = valueList;
}
public List<V> sortedValues() {
if (needsSort_) {
needsSort_ = false;
Collections.sort(valueList_, comparator_);
}
return valueList_;
}
// mutators
public void clear() {
map_.clear();
valueList_.clear();
needsSort_ = false;
}
public V put(K key, V value) {
valueList_.add(value);
needsSort_ = true;
return map_.put(key, value);
}
public void putAll(Map<? extends K, ? extends V> m) {
map_.putAll(m);
valueList_.addAll(m.values());
needsSort_ = true;
}
public V remove(Object key) {
V value = map_.remove(key);
valueList_.remove(value);
return value;
}
// accessors
public boolean containsKey(Object key) { return map_.containsKey(key); }
public boolean containsValue(Object value) { return map_.containsValue(value); }
public Set<java.util.Map.Entry<K, V>> entrySet() { return map_.entrySet(); }
public boolean equals(Object o) { return map_.equals(o); }
public V get(Object key) { return map_.get(key); }
public int hashCode() { return map_.hashCode(); }
public boolean isEmpty() { return map_.isEmpty(); }
public Set<K> keySet() { return map_.keySet(); }
public int size() { return map_.size(); }
public Collection<V> values() { return map_.values(); }
}
То, что вы ищете, это Исоф
.
Это инструмент командной строки, но для него также есть графический интерфейс на sourceforge .
strace -e trace=file -- <command>
покажет вам, какие именно файлы ваше приложение читает и записывает
Чтобы найти все файлы, измененные за последний 24 часа (последний полный день) в конкретный конкретный каталог и его подкаталоги:
find / directory_path -mtime -1 -print
подробнее на:
lsof выведет список всех открытых файлов для данного процесса:
lsof -p
Не уверен в программе, но команда find в утилите имеет множество параметров, которые позволят вам найти файлы и / или каталоги, которые были изменены в течение определенного периода времени.
Например:
$ find /home/you -iname "*.txt" -mtime -1 -print
Найдет текстовые файлы, которые последний раз были изменены 1 день назад.
Вы можете обернуть этот вызов в какой-нибудь сценарий или написать свое собственное небольшое приложение, чтобы использовать результаты.
Вот сайт с дополнительная информация и примеры:
Linux предоставляет API уведомлений об изменении файлов под названием «dnotify» вместе с утилитой командной строки dnotify . Вы можете использовать это для отслеживания изменений за последние 30 секунд.
Я бы, вероятно, написал приложение, которое строится непосредственно на Linux API и отбрасывает все события старше 30 секунд.