gpt4 book ai didi

java - Swingworker 具有 FileVisitor 类和 walkFileTree(),它在目录树中内部迭代 "set"个文件;在哪里发布()?

转载 作者:行者123 更新时间:2023-12-01 13:49:42 25 4
gpt4 key购买 nike

似乎长时间运行的树遍历器任务应该在类中定义,如下所示:

  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 方法?我见过的示例在 doInBackground() 中有 publish(),但在循环内,这在这里是不可能的。

我最关心的四个方法之一是 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()

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

...另一个奇怪的编辑...我当前的类定义...

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

... 呜呜呜呜呜呜呜呜呜呜............

最佳答案

由于您的 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;
}
}

}

注意,这没有 GUI,而是通过等待 get 返回来等待工作线程完成,这仅作为示例

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com