【问题标题】:Folder monitor Java code prints report twice文件夹监视器 Java 代码打印报告两次
【发布时间】:2016-02-05 15:23:58
【问题描述】:

使用该站点的一些答案,我用 Java 创建了一个小型文件夹监视器应用程序。它应该检查对特定文件夹的更改并将这些更改输出到文本文件。不幸的是,每次更改它都会打印两次报告。问题是我无法弄清楚报告的第一行来自哪里。请帮助我理解我做错了什么。

请在下面找到代码。我删除了部分代码,因为它不影响问答。

import java.io.File;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.commons.io.monitor.FileAlterationListener;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;

public class FolderMonitor {

    public FolderMonitor() {}

    //path to a folder you are monitoring
    public static final String FOLDER = "D:\\WatchedDir";

    public static void main(String[] args) throws Exception 
    {
        System.out.println("monitoring started");
        // The monitor will perform polling on the folder every 5 seconds
        final long pollingInterval = 6 * 1000;

        // Let's get a directory as a File object and sort all its files.
        File folderToMonitor = new File(FOLDER);
        File outputFile = new File("H:\\Dir_changes.txt");          

        if (!folderToMonitor.exists()) 
        {
            // Test to see if monitored folder exists
            throw new RuntimeException("Directory not found: " + FOLDER);
        }           

        FileAlterationObserver observer = new FileAlterationObserver(folderToMonitor);
        FileAlterationMonitor monitor = new FileAlterationMonitor(pollingInterval);
        FileAlterationListener listener = new FileAlterationListenerAdaptor() 
        {           
            // Is triggered when a file in the monitored folder is modified from 
            @Override
            public void onFileChange(File file) 
            {
                // "file" is the reference to the newly created file                
                try {writeToFile(outputFile, convertLongToDate(outputFile.lastModified()), ("File modified: "+ file.getCanonicalPath()));}               
                    catch (IOException e) {e.printStackTrace();} 
            }           
        };

        observer.addListener(listener);
        monitor.addObserver(observer);
        monitor.start();
    }

    private static void writeToFile(File filePath, String timeStamp, String caughtChange) throws IOException
    {
        FileWriter fileWriter = new FileWriter(filePath,true);

        BufferedWriter bufferFileWriter  = new BufferedWriter(fileWriter);

        fileWriter.append("\r" + timeStamp + " - " + caughtChange + "\r");

        bufferFileWriter.close();     
    }

    private static String convertLongToDate(long input)
    {
        Date date = new Date(input);
        Calendar cal = new GregorianCalendar();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MMM/dd hh:mm:ss z");
        sdf.setCalendar(cal);
        cal.setTime(date);
        return sdf.format(date);
    }
}

输出如下:

1454622374878 文件修改:D:\WatchedDir\second\inside3.txt 2016/Feb/04 04:46:25 EST - 文件已修改:D:\WatchedDir\second\inside3.txt

我无法弄清楚突出显示(粗体)部分的来源以及如何摆脱它。请帮忙!

【问题讨论】:

    标签: java directory monitoring


    【解决方案1】:

    我运行了您发布的相同代码,但在 .txt 文件中没有看到额外的输出。你能通过将输出定向到一个新文件来尝试一下,看看它是否有任何不同

    【讨论】:

    • 感谢您抽出宝贵时间查看!
    【解决方案2】:

    由于某种原因,Eclipse 正在执行我已经从类中删除并保存更改的代码。

    在我重新启动 Eclipse 并再次执行代码后,一切运行良好(惊喜)。

    我考虑删除这篇文章,但我决定留下它,以防有人会寻找这样的一段代码。我会留给版主来决定是否应该删除这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多