2015-05-29 1 views
1

Я хочу, чтобы моя программа выводилась так, что всякий раз, когда он получает текстовый файл от клиента, он будет печатать «Новый файл был получен!». Текстовые файлы будут храниться в папке C:/Users /% UserProfile%/Desktop/ad.Сравнение текущего времени даты (в реальном времени) с последним измененным файлом

Код, приведенный ниже, предназначен для проверки того, был ли получен новый текстовый файл в каталоге .

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

import javax.swing.Timer; 


public class Test { 

    final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    static int count = 0; 
    static File[] f = null; 
    static Date date = new Date(); 
    static Calendar now = null; 

    public static void main(String[] args) { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     while(true) { 
      try { 
       Thread.sleep(2000); 
      } catch (InterruptedException e1) { 
       e1.printStackTrace(); 
      } 
      f = new File("C:/Users/roberts/Desktop/ad").listFiles(); 
      int l = f.length; 
      System.out.println("There are " + l + " files in the directory"); 

      for (int i = 0; i < l; i++) { 
       System.out.println("file " + i + " date modified " + dateFormat.format(f[i].lastModified())); 
      } 
     } 
    } 
} 

Вывод общего количества файлов в каталоге изначально = 1 и последнего изменения

enter image description here

Вывод общего количества файлов в каталоге после того, как файл принимается = 2 и последнего изменения

enter image description here

Теперь для того, чтобы напечатать «новый файл был получен!» Мне нужно сравнить текущее время даты с последним измененным временем даты файла.

Это то, что я сделал

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 

import javax.swing.Timer; 


public class Test { 

    final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
    int interval = 1000; 
    static int count = 0; 
    static File[] f = null; 
    static Date date = new Date(); 
    static Calendar now = null; 

    public static void main(String[] args) { 
     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     while(true) { 

       f = new File("C:/Users/roberts/Desktop/ad").listFiles(); 
       int l = f.length; 
       System.out.println(l); 
       new Timer(1000, new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         now = Calendar.getInstance(); 
         for (int i = 0; i < l; i++) { 
          if(dateFormat.format(now.getTime()).equals(dateFormat.format(f[i].lastModified()))) { 
           System.out.println("A new file has been received!"); 
          } 
         } 

        } 
       }).start(); 

      try { 
       Thread.currentThread().join(); 
      } catch (InterruptedException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

Я пытался, но не печатает «Новый файл был получен!». Пожалуйста, помогите

ответ

1

Просмотр изменений файловой системы лучше всего сделать с помощью Watch Service. Теперь вы просматриваете изменения файлов, но вместо этого служба часов использует собственные события Windows.

Сначала вам просто нужно создать экземпляр класса WatchService.

Path path = Paths.get("c:\mydir"); 
WatchService service = path.getFileSystem().newWatchService(); 

Далее необходимо решить, какие мероприятия вы хотите отслеживать. Я думаю, вы хотите получать информацию только в том случае, если в папке появляются новые файлы.

path.register(service, StandardWatchEventKinds.ENTRY_CREATE); 

Далее service действует как буфер событий. Я предлагаю поместить обработку этого буфера в отдельную нить.

// repeat forever 
for (;;) 
{ 
    // this will block until there's something inside the buffer 
    WatchKey key = service.take(); 

    // 1 watchkey can contain multiple events, you need to iterate these. 
    for (WatchEvent<?> event : key.pollEvents()) 
    { 
    //todo: handle events 
    } 
} 
0

Это потому, что while(true) петля не петля, так что ваш код, который проверяет размер каталога работает только один раз, и переменная l остается неизменной. Вы блокируете поток навсегда с вызовом Thread.currentThread().join() (текущий поток блокирует до тех пор, пока текущий поток не остановится, т. Е. Навсегда). Timer срабатывает один раз каждые 1000 мс, но поскольку l не изменяется, он не находит новых файлов.

Если вы хотите просто посмотреть каталог изменений, а не изобретать колесо, лучше использовать стандартный класс JDK https://docs.oracle.com/javase/8/docs/api/java/nio/file/WatchService.html

Смежные вопросы