2015-01-14 2 views
-1

Я пытаюсь найти последнюю измененную версию файла, у меня это работает, но когда я пытаюсь найти определенный файл, я получаю NULLPointerException. Мой код:Поиск последнего измененного файла с определенными именами?

public static File getFile(String dir, String chat) { 

    File fl = new File(dir); 
    File[] files = fl.listFiles(new FileFilter() {   
     public boolean accept(File file) { 
      return file.isFile(); 
     } 
    }); 
    long lastMod = Long.MIN_VALUE; 
    File choice = null; 
    for (File file : files) { 
     if (file.lastModified() > lastMod && file.getName().contains(chat)) { 
      choice = file; 
      lastMod = file.lastModified(); 
     } 
    } 
    return choice; 
} 

код работает, когда вы берете "& & file.getName() содержит (чат)." Из. В противном случае мне была дана ошибка NullPointerException.

Я знаю, что-то вроде это работает, потому что я это работает, но нужно начинать с нуля с моим кодом :(

+0

что является NullPointerException? –

+0

Вы используете Java 7+? – fge

+0

thats все это дает мне .. и да – IEaTRuSHerZ

ответ

0

Вот где NullPointerException приходит.

File choice = null; 

Вам нужно создать экземпляр это перед вызовом его здесь -> выбор = файл;

File choice = new File(dir); 
+0

Существует еще один возможный NPE: '.listFiles()' – fge

+0

Я не согласен, потому что пользователь сказал, что он работал, если он не внес изменений в следующий цикл, поэтому ошибка должна быть внутри цикла. –

+0

Это, однако, возможный NPE. Попробуйте '.listFiles()' в каталоге, из которого вы не можете читать записи, например; или из 'File', который не является каталогом ... – fge

0

Вот версия с использованием java.nio.file:

public static Path getMostRecent(final String dir, final String chat) 
    throws IOException 
{ 
    final Path dirpath = Paths.get(dir).toAbsolutePath(); 
    Path ret = null; 
    FileTime mostRecent = FileTime.fromMillis(0L); // Jan 1st 1970, 00:00:00 GMT 
    FileTime current; 

    final DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<>() 
    { 
     @Override 
     public boolean accept(final Path entry) 
     { 
      return Files.isRegularFile(entry) 
       && entry.getFileName().toString().contains(chat); 
     } 
    }; 

    for (final Path entry: Files.newDirectoryStream(dirpath, filter)) { 
     current = Files.getLastModifiedTime(entry); 
     if (current.compareTo(mostRecent) > 0) { 
      mostRecent = current; 
      ret = entry; 
     } 
    } 

    return entry; 
} 

Если вы используете Java 8:

public static Path getMostRecent(final String dir, final String chat) 
    throws IOException 
{ 
    final Path dirpath = Paths.get(dir).toAbsolutePath(); 
    try (
     final Stream<Path> entries = Files.list(dirpath); 
    ) { 
     return entries.filter(Files::isRegularFile) 
      .filter(entry -> entry.getFileName().toString().contains(chat)) 
      .sorted(Comparator.comparing(Files::getLastModifiedTime).reversed()) 
      .findFirst().orElse(null); 
    } 
} 
Смежные вопросы