2015-05-10 2 views
3

Я использую Java версию 1.8.0_31.Почему поведение «Path.startsWith» отличается от поведения «String.startsWith» - даже для «Path.getFilename»

Я пытаюсь рекурсивно обращаться к дереву каталогов с помощью интерфейса FileVisitor. Программа должна печатать имя всех файлов в C:/books, имя файла которого начинается с «Ver». В каталоге C:/books два файла, который начинается с "Ver", Version.yxy и Version1.txt. Я пробовал использовать file.getFileName().startsWith("Ver"), но это возвращает false.

Я что-то упустил? Вот мой код:

public class FileVisitorTest { 

    public static void main(String[] args) { 

     RetriveVersionFiles vFiles = new RetriveVersionFiles(); 
     try { 
      Files.walkFileTree(Paths.get("c:", "books"), vFiles); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
    } 
} 

class RetriveVersionFiles extends SimpleFileVisitor<Path> { 

    public FileVisitResult visitFile(Path file, BasicFileAttributes attr) { 
     System.out.println(file.getFileName().startsWith("Ver") + " " 
       + file.getFileName()); 
     if (file.getFileName().startsWith("Ver")) { 
      //not entering this if block 
      System.out.println(file); 
     } 
     return FileVisitResult.CONTINUE; 
    } 
} 

Выход выше код:

false Version.txt 
false Version1.txt 

ответ

5

Path.getFileName() возвращает Path, содержащий только имя файла. Path.startsWith проверяет, начинается ли путь с той же последовательности компонентов пути - логической, а не текстовой операции. startsWith Javadoc является явным:

В UNIX, например, путь "Foo/бар" начинается с "Foo" и "Foo/бар". Он не начинается с «f» или «fo».

Если вы просто хотите, чтобы проверить текстуальных начинается-с-Несс, сначала преобразовать в строку с помощью вызова toString(): Path.getFileName().toString().startsWith("Ver").

+0

Спасибо, звучит логично и работает тоже. Я действительно ссылался на книгу KathySierra для сертификации Java, стр. 515, они приводили пример как, if (file.getFileName(). EndsWith (". Class")) Files.delete (file); ... и кажется, что это проблема. – Nicks

+3

Если я разработал API, я бы не добавил перегрузку с помощью String. Слишком легко сделать эту ошибку. –