Сделайте это для скрытых файлов:
File root = new File(yourDirectory);
File[] files = root.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return !file.isHidden();
}
});
Это не приведет к возврату скрытых файлов.
Что касается системных файлов, я считаю, что это концепция Windows и, следовательно, может не поддерживаться интерфейсом File
, который пытается быть независимым от системы. Однако вы можете использовать команды командной строки, если они существуют.
Или используйте то, что @Reimeus имел в своем ответе.
Возможно, как
File root = new File("C:\\");
File[] files = root.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
Path path = Paths.get(file.getAbsolutePath());
DosFileAttributes dfa;
try {
dfa = Files.readAttributes(path, DosFileAttributes.class);
} catch (IOException e) {
// bad practice
return false;
}
return (!dfa.isHidden() && !dfa.isSystem());
}
});
Ссылка на массив
пуста, скорее всего, потому что в rMap не было добавлено значение (или null
) с ключом 0
.
Если возможно, используйте универсальные шаблоны, чтобы убедиться, что ваши ключи имеют правильный тип. Вы также можете распечатать значения карты перед извлечением массива
, чтобы увидеть, что находится на карте. Пошаговое выполнение кода с помощью отладчика и наблюдения на rMap
также покажет, что содержит карта и когда она была изменена.
Как вы заполняете карту? Вы уверены, что помещаете в него ненулевую запись с ключом Integer
, равным 0?
Что ж, мы можем быть уверены, что это не так. Возможные причины:
Short
или Byte
объекты как ключи null
в карту под ключом 0
. Вы можете ответить на этот вопрос сами, запустив код в отладчике и глядя на содержимое карты.
Обновление:
Значение My Key - String
Что ж, вот и ваша проблема. rMap.get (0)
будет искать целое число
и не будет соответствовать записи для строки «0»
.
HashMap
допускает нулевые значения, поэтому значение, которое вы получаете с помощью String array [] = rMap.get (0);
, может быть нулевым. При доступе к нулевому массиву возникает NPE.
Это проблема, когда вы вызываете метод get реализации Map, сигнатура метода get java.util.Map - get (java.lang.Object), поэтому любой объект будет принят в качестве его аргумента.
Ключ, который работает нормально, - это либо передать строку (значение = 0) в качестве ключа, либо переопределить hashCode и равные методы объекта аргумента, который не является объектом java.lang.String.
Метод get () в Hashmap принимает ключ, а не индекс, чтобы идентифицировать значение, которое вы хотите получить. Если вам нужен упорядоченный список элементов, вам нужно будет использовать подкласс List (или принудительно упорядочить, вы сами). Если вы хотите использовать Hashmap, используйте метод keys (), чтобы получить перечисление всех ключей карты.
(удален над текстом в связи с прояснением вопроса. Оставив текст ниже, хотя это не проблема, но это важное соображение)
Кроме того, вам нужно быть очень осторожным, чтобы не создавать условий гонки, так как вы работаете по потокам. Хотя собственная Hashtable Java синхронизирована, это не означает, что данные в ней синхронизированы. То есть вы можете MyObj obj = get (xxx) в одном htread, Nd начать манипулировать obj в двух отдельных потоках, возможно, наступая друг на друга. В зависимости от вашего приложения вы можете использовать Hashtable.remove (), чтобы данные исчезли с карты и не могли быть использованы повторно, или вам могут понадобиться некоторые синхронизированные блоки (remove () вполне может быть более простой реализацией, thoguh вам нужно будет аккуратно обработать условия, когда на карте сначала есть данные, а затем эти данные исчезают).