2016-08-17 2 views
0

Я не уверен, что я использую правильный подход, поэтому я открыт для новых идей, прежде чем сообщить мне, что я делаю это неправильно. У меня есть массив путей каталогов, которые мне нужны для поиска файлов. Скажем, все .txt на примере. Теперь я запускаю Files.walkFileTree(...) в каждом каталоге и с SimpleFileVisitor, который останавливается при первом совпадении. Но теперь я хочу добавить кнопку next, которая продолжает поиск с момента остановки. Как я могу это сделать?Продолжить посещение SimpleFileVisitor

Я думал, что могу сохранить все совпадения в массиве, а затем прочитать его оттуда, но это пространство и память. Поэтому лучше понять.

// example paths content: [/usr, /etc/init.d, /home] 
ArrayList<String> paths; 
for(String s : paths) 
    Files.walkFileTree(Paths.get(s), new SimpleFileVisitor<Path>() { 
     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
      if (alreadyfound >= 10) { 
       return FileVisitResult.TERMINATE; 
      } 
      if (file.toString().endsWith(".txt")) { 
       System.out.println("Found: " + file.toFile()); 
      } 
      return FileVisitResult.CONTINUE; 
     } 
    }); 
+0

вы не можете просто сохранить точку я в сессии? – DamienB

+0

@ DamienBoue Да, но я не знаю как. Если скажем, я смотрю в корне и находит что-то на /home/file.txt. Я могу сохранить путь, но как я могу продолжить работу во всех корневых подкаталогах? –

+0

Вы сказали, что у вас есть массив. Получить индекс в массиве совпадающего пути. А потом включите его. Затем вы можете начать с этого индекса в нашем массиве. Код для удаления для дополнительной помощи – DamienB

ответ

1

Я как-то написал класс, который должен делать именно то, что вы описали. Я решил это, запустив FileVisitor в своей теме. Когда файл был найден с нужным расширением, он просто прекратил выполнение с wait(), пока кнопка не сообщила, чтобы продолжить с notify().

public class FileSearcher extends Thread{ 
    private Object lock = new Object(); 
    private Path path; 
    private JLabel label; 
    private String extension; 

    public FileSearcher(Path p, String e, JLabel l){ 
     path = p; 
     label = l; 
     extension = e; 
    }  
    public void findNext(){ 
     synchronized(lock){ 
      lock.notify(); 
     } 
    } 
    @Override 
    public void run() { 
     try { 
      Files.walkFileTree(path, new SimpleFileVisitor<Path>() { 
       @Override 
       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
        if(file.toString().toLowerCase().endsWith(extension)){ 
         label.setText(file.toString()); 
         synchronized(lock){ 
          try { 
           lock.wait(); 
          } catch (InterruptedException e1) { 
           e1.printStackTrace(); 
          } 
         } 
        } 
        return FileVisitResult.CONTINUE; 
       } 
      }); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     }  
    } 
} 

Простой пример того, как использовать это будет так

JFrame frame = new JFrame(); 
JPanel panel = new JPanel(); 
panel.setLayout(new FlowLayout()); 
JLabel label = new JLabel(); 
FileSearcher fileSearcher = new FileSearcher(Paths.get("c:\\bla"), ".txt", label); 
JButton button = new JButton(); 
button.setText("next"); 
button.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     fileSearcher.findNext(); 
    }}); 
panel.add(label); 
panel.add(button); 
frame.add(panel); 
frame.setSize(300, 300); 
frame.setLocationRelativeTo(null); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.setVisible(true); 
fileSearcher.start(); 
+0

Я не очень разбираюсь в java-параллелизме (?). Поэтому я не совсем понимаю, что делает этот код. Я попробую и прочитаю документацию перед ее использованием, но, похоже, это то, что я искал. Только одно, как я могу изменить его для чтения группы? Я имею в виду вместо того, чтобы дважды называть findNext, что он находит два файла за один вызов. (Просто идея, не нужно менять код, если хотите) –

+0

Добавьте счетчик и прирост для каждого найденного файла. И если больше некоторого значения, сбросьте счетчик и выполните вызов 'lock.wait' (в его' синхронизированном' блоке, конечно) – ArcticLord

Смежные вопросы