似乎长时间运行的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/