似乎长时间运行的tree walker任务应在如下类中定义:

  public class TreeWalker extends SwingWorker<Void,String> implements FileVisitor<Path>


并开始这样的地方:

TreeWalker walker = (new TreeWalker());
           walker.execute();


长时间运行的任务不仅由调用walkFileTree()Files类中的方法)发起,而且完全由其一次执行。因此,一定要在doInBackGround()中对其进行调用。

  protected Void doInBackground() throws Exception {
    Files.walkFileTree(SearchyGUI.p , this);
    return null;
  }


请注意,walkTreeFile()内部为每个遇到的文件调用四个方法。程序员编写的循环是不可行的。所以这是我的问题。如何使用publish()将文件信息作为字符串发送到需要覆盖的process方法?我看过的示例在publish()内有doInBackground(),但是在循环内,在这里是不可能的。

我最关心的四种方法之一是visitFile(),需要找到walkFileTree(),我怀疑这是放置publish()的位置:

  public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException {
    if (...we want this file...)
        publish(f.toString());
    return CONTINUE;
  }


我可以将walkFileTree()调用的所有4种方法放在doInBackground()的内部类中,但这似乎是一厢情愿的想法。

附言我不能使用get();这就是重点(据我所知)-获取结果的延迟太多(可能要处理成千上万个文件才能找到十几个文件),直到doInBackground()结束。

==========================================

编辑#3,原始发布时间后50分钟

  public static void doIt(){
      try {
        System.out.println("It begins..."); // This does happen.
        TreeWalker walker = new TreeWalker();
        walker.execute();
        SearchyGUI.info.setVisible(true); // Form is displayed, stays blank.
      }
      catch (Exception e) { System.out.println("Uh-oh"); } // This does NOT happen.
    }


==========================================

(编辑2,发布后40分钟)

这是我的处理方法。 println没有执行。

protected void process(String s) {
    System.out.println("in process()...");
    report(s); // my method to append text area with another line of file info
}


另外,包含doInBackground()的类语句已更改:

public class TreeWalker extends SwingWorker<Void, String> implements Runnable{


Walking类嵌套在doInBackground()中。

==========================================

(编辑,发布后20分钟)

编译后却什么也没做:

  protected Void doInBackground() throws Exception
  {
    class Walking implements FileVisitor<Path>
    {
      @Override
      public FileVisitResult visitFile(Path f, BasicFileAttributes a) throws IOException
      {
        String modifyDate    = a.lastModifiedTime().toString().substring(0,10);
        String fpathname = f.toString();// + "\\" + f.getFileName().toString());
        if (...we want this one...)
            publish(f.getFileName());
        return disposition;
      }
... other methods excluded
    } // end inner class

    System.out.println("walking??");                                 // We get here ...
    Files.walkFileTree(SearchyGUI.p , (FileVisitor<? super Path>) this);
    System.out.println("Finished walking??");                        // ... but not here.
    return null;
  } // end of doInBackground()


============================

...另一个freakin的编辑...我当前的班级防御...

public class GUI extends JFrame implements ActionListener, MouseListener, KeyListener

public class TreeWalker extends SwingWorker<Void, String> implements Runnable{

protected Void doInBackground() throws Exception {
  class Walking implements FileVisitor<Path>{ // CLASS INSIDE doInBackground


... zzzzzzzzzzzzzzzzzzzzzz ......

最佳答案

由于您的TreeWalker扩展了SwingWorker并实现了FileVisitor,因此您可以从任何回调方法中调用publish,例如...

public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
    publish(dir.toString());
    return FileVisitResult.CONTINUE;
}


现在,根据需要,您需要使用所需的任何方法将Path元素转换为String

更新了工作示例

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.SwingWorker;

public class TreeWalkerExample {

    public static void main(String[] args) {
        new TreeWalkerExample();
    }

    public TreeWalkerExample() {
        TreeWalker tw = new TreeWalker();
        tw.execute();
        try {
            tw.get();
        } catch (InterruptedException | ExecutionException ex) {
            ex.printStackTrace();
        }
    }

    public class TreeWalker extends SwingWorker<Void, Path> implements FileVisitor<Path> {

        @Override
        protected void process(List<Path> chunks) {
            for (Path p : chunks) {
                System.out.println(p);
            }
        }

        @Override
        protected Void doInBackground() throws Exception {
            Path p = Paths.get(System.getProperty("user.home"));
            System.out.println(p);
            Files.walkFileTree(p, this);
            return null;
        }

        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            FileVisitResult fvr = FileVisitResult.CONTINUE;
            if (dir.getFileName().toString().startsWith(".")) {
                fvr = FileVisitResult.SKIP_SUBTREE;
            }
            return fvr;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            publish(file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
            return FileVisitResult.TERMINATE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
            return FileVisitResult.CONTINUE;
        }
    }

}


Nb,它没有GUI,但是通过等待get返回来等待工作程序完成只是一个示例

关于java - Swingworker具有FileVisitor类和walkFileTree(),可在目录树中的一组"file"内部进行内部迭代;在哪里发布()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20060366/

10-11 15:07