سؤال

وأود أن يتم إخطار عندما تم تغيير ملف في نظام الملفات. لقد وجدت سوى موضوع أن استطلاعات الملكية الملف lastModified وبشكل واضح هذا الحل ليس الأمثل.

هل كانت مفيدة؟

المحلول

وعلى المستوى المنخفض السبيل الوحيد لنموذج هذه الأداة المساعدة هو أن يكون الاقتراع موضوع على دليل والحفاظ على مراقبة على سمات الملف. ولكن يمكنك استخدام أنماط لوضع محول لمثل هذه المرافق.

لخوادم التطبيقات سبيل المثال J2EE مثل القط وغيرها لديها ميزة تحميل السيارات حيث في أقرب وقت التغييرات نشر واصف أو فئة بريمج التغييرات إعادة تشغيل التطبيق.

ويمكنك استخدام المكتبات من هذه الخوادم لأن معظم من قانون هر غير قابلة لإعادة الاستخدام ومفتوحة المصدر.

نصائح أخرى

ولقد كتبت رصد ملف سجل من قبل، ولقد وجدت أن تؤثر على أداء نظام الاقتراع سمات ملف واحد، عدة مرات في الثانية، هو في الواقع صغيرة جدا.

وجافا 7، وأضافت كجزء من NIO.2 و WatchService API

<اقتباس فقرة>   

تم تصميم API WatchService للتطبيقات التي تحتاج إلى أن يتم إعلامك عن أحداث تغيير الملف.

ويمكنني استخدام API VFS من طراز أباتشي العموم، وهنا مثال على كيفية مراقبة ملف دون تأثير كبير في الأداء:

<وأ href = "http://commons.apache.org/proper/commons-vfs/commons-vfs2/apidocs/org/apache/commons/vfs2/impl/DefaultFileMonitor.html" يختلط = "نوفولو noreferrer" > DefaultFileMonitor

وهناك ليب دعا jnotify التي يلتف <لأ href = "HTTP: //en.wikipedia. غزاله / ويكي / inotify "يختلط =" noreferrer "> inotify على لينكس ودعم أيضا للنوافذ. تستخدم أبدا ذلك، وأنا لا أعرف كيف جيدة هو عليه، ولكن الامر يستحق المحاولة أود أن أقول.

وجافا المشاعات-IO لديه <لأ href = "http://commons.apache.org/proper/commons-io//javadocs/api-release/org/apache/commons/io/monitor/FileAlterationObserver.html "> FileAlterationObserver . فإنه الاقتراع في توليفة مع FileAlterationMonitor. على غرار المشاعات VFS. والميزه هو أن لديها أقل بكثير التبعيات.

وتحرير: تبعيات أقل غير صحيح، فهي اختيارية لVFS. ولكنه يستخدم جافا الملفات بدلا من طبقة تجريد VFS.

و"المزيد من الميزات NIO" لديها وظائف الساعات الملف، مع تنفيذ يعتمد على نظام التشغيل الأساسي. ينبغي أن يكون في JDK7.

وأركض هذا مقتطف من الشفرة في كل مرة أذهب إلى قراءة خصائص الملف، فقط في الواقع قراءة الملف إذا كان قد تم تعديله منذ آخر مرة قرأت ذلك. آمل أن يساعد هذا شخص.

private long timeStamp;
private File file;

private boolean isFileUpdated( File file ) {
  this.file = file;
  this.timeStamp = file.lastModified();

  if( this.timeStamp != timeStamp ) {
    this.timeStamp = timeStamp;
    //Yes, file is updated
    return true;
  }
  //No, file is not updated
  return false;
}

ويستخدم نهج مماثل في Log4J <لأ href = "http://grepcode.com/file/repo1.maven.org/maven2/log4j/log4j/1.2.17/org/apache/log4j/helpers/FileWatchdog. جافا رقم 74 "يختلط =" نوفولو "> FileWatchdog .

ويمكنك الاستماع تغييرات الملف باستخدام FileReader. بلز انظر المثال أدناه

// File content change listener 
private String fname;
private Object lck = new Object();
... 
public void run()
{
    try
    {
        BufferedReader br = new BufferedReader( new FileReader( fname ) );
        String s;
        StringBuilder buf = new StringBuilder();
        while( true )
        {
            s = br.readLine();
            if( s == null )
            {
                synchronized( lck )
                {
                    lck.wait( 500 );
                }
            }
            else
            {
               System.out.println( "s = " + s );
            }

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

إذا كنت على استعداد للتخلي عن بعض المال، JNIWrapper هي مكتبة مفيدة مع Winpack، سوف تكون قادرة على الحصول على أحداث نظام الملفات على بعض الملفات. للأسف النوافذ فقط.

https://www.teamdev.com/jniwrapper .

وعلى خلاف ذلك، اللجوء إلى التعليمات البرمجية الأصلية ليست دائما أمرا سيئا خصوصا عندما يكون أفضل على العرض هو آلية الاقتراع كما حدث ضد الأصلي.

ولقد لاحظت أن عمليات نظام الملفات جافا يمكن أن تكون بطيئة على بعض أجهزة الكمبيوتر ويمكن أن تؤثر بسهولة أداء التطبيق إذا لم يتم التعامل معها بشكل جيد.

ويمكنك أيضا أن تنظر أباتشي العموم JCI (جافا مترجم واجهة). ورغم أن هذا API يبدو أن تركز على تجميع ديناميكية من الطبقات، فإنه يشمل أيضا دروسا في API لها أن تراقب تغييرات الملف.

وعلى سبيل المثال: http://commons.apache.org/jci/usage.html

ويوفر الربيع التكامل آلية لطيفة لمشاهدة الدلائل والملفات: HTTP: / /static.springsource.org/spring-integration/reference/htmlsingle/#files . متأكد من انها عبر منصة (لقد استعملت على ماك، لينكس، ويندوز).

وهناك مكتبة عبر سطح المكتب التجاري للملفات والمجلدات مشاهدة دعا JxFileWatcher. ويمكن تحميلها من هنا: http://www.teamdev.com/jxfilewatcher/

وأيضا يمكنك أن ترى ذلك في العمل على الانترنت:   http://www.teamdev.com/jxfilewatcher/onlinedemo/

والاقتراع ومشاركة خاصية ملف تعديل هو الحل بسيطة لكنها فعالة على الرغم من. مجرد تعريف فئة توسيع بلدي FileChangedWatcher وتنفيذ طريقة onModified():

import java.io.File;

public abstract class FileChangedWatcher
{
    private File file;

    public FileChangedWatcher(String filePath)
    {
        file = new File(filePath);
    }

    public void watch() throws InterruptedException
    {
        long currentModifiedDate = file.lastModified();

        while (true)
        {
            long newModifiedDate = file.lastModified();

            if (newModifiedDate != currentModifiedDate)
            {
                currentModifiedDate = newModifiedDate;
                onModified();
            }

            Thread.sleep(100);
        }
    }

    public String getFilePath()
    {
        return file.getAbsolutePath();
    }

    protected abstract void onModified();
}

وعلى غرار إجابات أخرى، وهنا كيف فعلت ذلك باستخدام ملف، الموقت، وTimerTask السماح لهذا السباق بمثابة اقتراع موضوع الخلفية على فترات محددة.

import java.io.File;
import java.util.Timer;
import java.util.TimerTask;

public class FileModifiedWatcher
{
  private static File file;
  private static int pollingInterval;
  private static Timer fileWatcher;
  private static long lastReadTimeStamp = 0L;

  public static boolean init(String _file, int _pollingInterval)
  {
    file =  new File(_file);
    pollingInterval = _pollingInterval; // In seconds

    watchFile();

    return true;
  }

  private static void watchFile()
  {
    if ( null == fileWatcher )
    {
      System.out.println("START");

      fileWatcher = new Timer();

      fileWatcher.scheduleAtFixedRate(new TimerTask()
      {
        @Override
        public void run()
        {

          if ( file.lastModified() > lastReadTimeStamp )
          {
            System.out.println("File Modified");
          }

          lastReadTimeStamp = System.currentTimeMillis();
        }
      }, 0, 1000 * pollingInterval);
    }

  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top