2016-08-17 3 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

배열이 있다고하셨습니다. Array의 메소드 일치하는 패스의 인덱스를 가져옵니다. 그런 다음 세션에 넣으십시오. 그런 다음 Array에서이 색인에서 시작할 수 있습니다. 추가 도움을위한 코드 무효화 – DamienB

답변

1

필자가 설명한 내용을 정확하게 수행해야하는 클래스를 작성했습니다. 나는 자체 스레드에서 FileVisitor을 실행하여 문제를 해결했습니다. 파일이 원하는 확장자로 발견되면 버튼이 notify()으로 계속 진행될 때까지 wait()으로 실행이 중지되었습니다.

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

자바 동시성 (?)에 대해서는 잘 모른다. 그래서이 코드가하는 일을 실제로 이해하지 못합니다. 내가 그것을 시도하고 사용하기 전에 설명서를 읽을거야하지만 내가 찾고있는 것 같습니다. 한 가지 방법은 그룹을 읽기 위해 어떻게 바꿀 수 있습니까? findNext를 두 번 호출하는 대신 한 번의 호출로 두 개의 파일을 찾습니다. (단지 생각, 원하는 경우 코드를 변경할 필요가 없습니다.) –

+0

발견 된 모든 파일에 대해 카운터와 증가분을 추가하십시오. 그리고 어떤 값보다 크면 카운터를 리셋하고'lock.wait' 호출을합니다 (물론'synchronized' 블록에서) – ArcticLord