文件夹监视器Java代码打印报告两次

问题描述:

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

请找到下面的代码。我删除了代码的一部分,因为它不影响第q & A.

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 \秒\ inside3.txt 2016 /月/ 04 4点46分25秒EST - 文件修改:d:\ WatchedDir \秒\ inside3.txt

我想不通的地方突出显示(黑体)一部分来自于如何得到 摆脱它。请帮忙!

我运行了与您发布的代码相同的代码,并且在.txt文件中看不到额外的输出。您可以请尝试通过将输出导向到一个新文件,看看它是否有任何区别

+0

谢谢您花时间检查! – indigo

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

当我重新启动Eclipse并再次执行代码后,一切都运行正常(惊喜)。

我曾考虑过删除这篇文章,但我决定留下它以防万一有人在寻找这样一段代码。我将留给主持人决定是否应该删除这个问题。