Java 线程处理与 walkFileTree

标签 java

我是java线程过程的新手,我找到了一个示例代码,我有兴趣了解它们的代码如何流动,所以我可以将其放入我的代码中。这是我的reference 。我将使用 Files.walkFileTree() 向 WatchService 注册主目录和子目录中所有新创建的文件夹

这是我的示例文件夹结构
< br/>

Root : C:/REST API/source/
sub directory : /source/abc/



首先,我将向 WatchService 注册我的根目录,并创建文件夹 abc。但是,当我尝试像之前描述的那样进行测试时,我无法完全理解编译调试消息的流程

这是我的编译器消息

Register path for Watcher Service
The Main Path is :C:\REST API\source
The sub path is :C:\REST API\source
In RegisterDIR method () path valueC:\REST API\source
Register path for Watcher Service
The Main Path is :C:\REST API\source
The sub path is :C:\REST API\source
In RegisterDIR method () path valueC:\REST API\source
The Main Path is :C:\REST API\source
The sub path is :C:\REST API\source\New folder
In RegisterDIR method () path valueC:\REST API\source\New folder
Register path for Watcher Service
The Main Path is :C:\REST API\source
The sub path is :C:\REST API\source
In RegisterDIR method () path valueC:\REST API\source
The Main Path is :C:\REST API\source
The sub path is :C:\REST API\source\abc
In RegisterDIR method () path valueC:\REST API\source\abc



这是我的示例代码

import java.io.IOException;
import java.nio.file.FileSystems;
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.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

public  class AbsolutePath<WatchListener>
{
    static Path mainPath;
    static WatchService svc;
    Thread watch;
    static Map <WatchKey , Path> keyMap;
    WatchKey wk;
    Timer timer;
    WatchListener lin;


    public static void main(String [] args ) throws IOException
    {

        mainPath = Paths.get("C:/REST API/source/");

        svc =  FileSystems.getDefault().newWatchService();

        keyMap = new HashMap<>();

        AbsolutePath ab = new AbsolutePath();

        ab.start();
    }

    private void start() throws IOException
    {

        watch = new Thread(new Runnable()
              {
                 public void run()
                 {
                    if(!Thread.currentThread().isInterrupted()) 
                    {

                        walkTreeAndSetWatches();
                        while(true)
                        {
                            try 
                            {

                                wk = svc.take();

                                wk.pollEvents();

                                wk.reset();

                                newRegister();

                            } 
                            catch (InterruptedException e)
                            {
                                e.printStackTrace();
                            }
                        }
                    }
                 }

              });

      watch.start();
    }
    private synchronized void walkTreeAndSetWatches()
    {
        System.out.println("Register path for Watcher Service");
        try
        {
            Files.walkFileTree(mainPath, new FileVisitor<Path>()
            {
                @Override
                public FileVisitResult preVisitDirectory(Path path, BasicFileAttributes attr) throws IOException 
                {
                     System.out.println("The Main Path is :"+mainPath);
                     System.out.println("The sub path is :"+path);
                    if(attr.isDirectory())
                    {

                         registerDIR(path);
                    }
                    return FileVisitResult.CONTINUE;
                }



                @Override
                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException 
                {

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException 
                {

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException 
                {

                    return FileVisitResult.CONTINUE;
                }


            });
        }
        catch(IOException io)
        {
            io.printStackTrace();
        }
    }

    private void registerDIR(Path path) 
    {
        try 
        {
             System.out.println("In RegisterDIR method () path value"+path);
             keyMap.put(path.register(svc, StandardWatchEventKinds.ENTRY_CREATE),path);

        }

        catch (IOException e) 
        {
           e.printStackTrace();
        }

    }

     private synchronized void newRegister() 
    {
      timer = new Timer();

      timer.schedule(new TimerTask()
              {

                @Override
                public void run() 
                {

                    walkTreeAndSetWatches();


                }


              },3000);
    }

}



有人可以帮助我理解为什么我的代码流变得这样,是因为线程句柄有问题吗?在我的引用链接中,如果在受监视的目录中创建了文件夹/文件,他们如何处理事件,因为我找不到它如何处理此类事件

最佳答案

发生这种情况是因为在 while 循环中您调用了 newRegister() ,而 newRegister() 又从静态的 mainPath 开始。 一些建议:

  • 重构代码以消除静态,
  • 这是一个递归算法,因此在注册新路径时需要将新路径传递给新的walker。

附加问题:您不喜欢原始代码中的哪些内容而导致您重写了它? :)(另一种说法:您想要添加/删除哪种功能?)

关于Java 线程处理与 walkFileTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41612080/

相关文章:

java - HTTP 请求以垃圾字符响应

java - 改造没有端点的 2 GET 请求?

java - Red5 最新 svn : configuring tomcat as Java EE-Container

java - Wicket页面参数

java - 无法访问 Spring Boot 和 Jersey 应用程序中的某些 Controller

java - Files.isHidden C :\\changed between JDK12 and JDK13 on windows

java - 无法解析符号 "postDelayed"

java - HttpServlet 类与 Jersey 的混淆

java - JAXB 使用不同标签解码 XML 元素

java - 密码验证和 UNICODE