Я думал, что поделюсь своим счастьем в решении этой проблемы. Я использую JDK 1.6.0_23 и поэтому не могу извлечь выгоду из NIO2. Я строю и работаю только на Windows 7 / x64, поэтому пробег может отличаться в других средах. К сожалению, другие решения здесь не помогли мне избежать исключений NullPointerException, возникающих при попытке пройти через соединение (вероятно, из-за соединения! = Символическая ссылка ....). Хотя я не ограничен версией JDK, я решил немного подождать с этой проблемой.
У меня был этот код, который вызывал бы исключение NullPointerException, если бы он использовался для символической ссылки или при обращении к каталогу «System Volume Information» (Обратите внимание, traverseItem.f () возвращает объект типа java.io.File)
if (traverseItem.f().isDirectory) {
for (File item : traverseItem.f().listFiles()) {
Итак, это предположительно каталог, но вызов listFiles () для него вызывает NPE. Что делать? Я заметил метод list () и подумал, будет ли он демонстрировать такое же поведение. Я обнаружил следующее:
Вызов list () для файла, описывающего пустую папку, возвращает массив String [] нулевой длины. Однако вызов list () для файла, описывающего соединение, которое в противном случае вылетало бы из listFiles (), возвращает null
Мне удалось избежать исключений NullPointerException, добавив следующий тест перед вызовом listFiles ()
String[] contents = traverseItem.f().list();
if (contents != null) { //Non-traversible if null, possibly junction or ???
Остается провести исчерпывающую проверку всех случаев перехода, символической ссылки, жесткой ссылки и, смею упомянуть, ярлыка, но это может помочь некоторым.