জাভাতে ফাইলটি শ্রোতার পরিবর্তিত হয়েছে


104

ফাইল সিস্টেমে কোনও ফাইল পরিবর্তন করা হলে আমি অবহিত হতে চাই। আমি সর্বশেষ odষত ফাইলের সম্পত্তি পোল করে এমন থ্রেড ছাড়া কিছুই পাইনি এবং স্পষ্টতই এই সমাধানটি অনুকূল নয়।


সমস্ত প্রতিক্রিয়া জন্য ধন্যবাদ। যেহেতু আমার প্রয়োজনগুলি ক্ষুদ্র (আমার ওয়েব অ্যাপ্লিকেশনে পরিবর্তিত একটি সম্পত্তি ফাইলটি পুনরায় লোড করা দরকার..সেই কারণ পুরো ওয়েব অ্যাপ পুনরায় চালু করা ধীরে ধীরে), আমি জরিপের মডেলটির সাথে অবিচল থাকব। কমপক্ষে এখন আমি জানি যে এইগুলির ক্ষেত্রে সহজ সমাধানের কোনও উপায় নেই।
চেঙ্গ81

14
শুধু একটি নোট. বড় আকারের ফাইলগুলি ধীরে ধীরে আসার ঝুঁকির আগে আমরা যখন এই সমস্যার সমাধান করেছি তখন এবং পোলিং মেকানিজম প্রায়শই কোনও নতুন বা পরিবর্তিত ফাইল সম্পূর্ণরূপে লিখিত হওয়ার আগে আবিষ্কার করেছিল। এটি সমাধানের জন্য একটি 'দুই কামড়' সমাধান গৃহীত হয়েছিল। কলকারীটি লক্ষ্য করে একটি ফাইল বদলেছে, তবে নতুন / পরিবর্তিত ফাইলের সিস্টেমকে অবহিত না করে যতক্ষণ না দুটি পোলের জন্য এটির মতো দেখা যায়: যেমন স্থির হয়ে যায়। ব্যাডফাইলে প্রচুর ত্রুটি নিরাময় হয়েছে।
স্টিভ পাওয়েল

1
একদিকে যেমন টমক্যাট দূরবর্তী উত্স থেকে ওয়েবঅ্যাপস ফোল্ডারে বড় ওয়ার ওয়ার ফাইলগুলি ফেলে দেওয়ার সময় সেই সমস্যায় পড়ে এবং এটি দীর্ঘ সময় ধরে করে has
জন রিক্স

উত্তর:


21

নিম্ন স্তরে এই ইউটিলিটির মডেল করার একমাত্র উপায় হ'ল ডিরেক্টরিতে থ্রেড পোলিং করা এবং ফাইলের বৈশিষ্ট্যগুলিতে নজর রাখা। তবে আপনি এই জাতীয় ইউটিলিটির জন্য অ্যাডাপ্টার বিকাশ করতে প্যাটার্নগুলি ব্যবহার করতে পারেন।

উদাহরণস্বরূপ j2ee অ্যাপ্লিকেশন সার্ভারের মতো টমক্যাট এবং অন্যদের মধ্যে একটি অটো লোড বৈশিষ্ট্য রয়েছে যেখানে স্থাপনার বিবরণী পরিবর্তন বা সার্লেট শ্রেণীর সাথে সাথে অ্যাপ্লিকেশন পুনরায় আরম্ভ হবে।

টমক্যাটের বেশিরভাগ কোড পুনরায় ব্যবহারযোগ্য এবং ওপেনসোর্স হিসাবে আপনি যেমন সার্ভারগুলি থেকে গ্রন্থাগারগুলি ব্যবহার করতে পারেন।


59
এটি জাভা in-তে
এঙ্গেলেন

সেই এপিআই অত্যন্ত অপর্যাপ্ত, এটি লিনাক্সে ফাইল ঘনিষ্ঠ ইভেন্টগুলির জন্য বিজ্ঞপ্তি সরবরাহ করে না। সুতরাং, একটি সহজ কেস দেওয়া, যখন একটি ফাইল বন্ধ থাকে, এটি অন্য ডিরেক্টরিতে অনুলিপি করে কাজ করে না।
বাইনারিটেম্পল_পিক্স

117

আমি এর আগে একটি লগ ফাইল মনিটর লিখেছি এবং আমি দেখতে পেয়েছি যে একটি একক ফাইলের বৈশিষ্ট্যগুলি, কয়েক সেকেন্ডে কয়েকবার ভোটদানের সিস্টেমের কার্য সম্পাদনের উপর প্রভাবটি আসলে খুব কম।

জাভা 7, এনআইও 2 এর অংশ হিসাবে ওয়াচ সার্ভিস এপিআই যুক্ত করেছে

ওয়াচ সার্ভিস এপিআই অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা হয়েছে যা ফাইল পরিবর্তন ইভেন্টগুলি সম্পর্কে অবহিত হওয়া দরকার।


10
আমি ডিরেক্টরি দেখার জন্য উদাহরণগুলি দেখতে পাচ্ছি, তবে একটি পৃথক ফাইলের কী হবে?
আর্কিমিডস ট্রাজানো

@ আর্কিমিডিজ ট্রাজানো ডিরেক্টরিতে যখন কোনও ফাইলের পরিবর্তন হয় তখন এআইপিটি আপনাকে জানায়। যে ইভেন্টটি ট্রিগার করা হয়েছে তাতে ফাইলের নাম পরিবর্তিত হয়েছে। সুতরাং আপনি একটি নির্দিষ্ট ফাইল বা ফাইলগুলির জন্য ইভেন্টগুলি পরিচালনা করতে পারেন এবং অন্যকে উপেক্ষা করতে পারেন।
মাইকেল


39

আমি অ্যাপাচি কমন্স থেকে ভিএফএস এপিআই ব্যবহার করি, পারফরম্যান্সে খুব বেশি প্রভাব ছাড়াই কোনও ফাইলকে কীভাবে পর্যবেক্ষণ করা যায় তার উদাহরণ এখানে:

DefaultFileMonitor


27

একটা শান্ত করে বলা হয় jnotify যে গোপন inotify লিনাক্স এবং উইন্ডোজের জন্য সমর্থন আছে। এটি কখনই ব্যবহার করা হয়নি এবং আমি জানি না এটি কতটা ভাল, তবে আমি বলার চেষ্টা করার মতো এটি worth


1
এটি পুরোপুরি এবং ব্যবহার করতে খুব সহজ কাজ করে। আমি বহু বছর ধরে ইনোটিফাই ব্যবহার করছি। এটি দ্রুত, স্থিতিশীল এবং নির্ভরযোগ্য
ᴉɹǝɥɔ

8

জাভা কমন্স-আইও-তে একটি ফাইলএল্টেরেশনঅবার্সবার রয়েছে । এটি ফাইলএল্টেরেশনমনিটরের সাথে একত্রে ভোটদান করে। কমন্স ভিএফএসের মতো। সুবিধাটি হ'ল এর অনেক কম নির্ভরতা রয়েছে।

সম্পাদনা করুন: কম নির্ভরতা সত্য নয়, তারা ভিএফএসের জন্য alচ্ছিক। তবে এটি ভিএফএস অ্যাস্ট্রাকশন স্তরের পরিবর্তে জাভা ফাইল ব্যবহার করে।


4

অন্তর্নিহিত ওএসের উপর নির্ভরশীলতার সাথে "আরও এনআইও বৈশিষ্ট্যগুলি" ফাইলের ঘড়ির কার্যকারিতা রয়েছে। জেডিকে 7 তে হওয়া উচিত।


আপনি কি আরও নির্দিষ্ট হতে পারেন বা ডকুমেন্টেশনের লিঙ্ক পোস্ট করতে পারেন?
লুসিও

এটি প্যাকেজ বলে মনে হচ্ছে java.nio.file। একটি টিউটোরিয়াল দেখুন ।
ডেভিড এল।

4

আমি যখনই এই বৈশিষ্ট্যের ফাইলটি পড়তে যাই আমি কোডের এই স্নিপেটটি চালিত করি, কেবলমাত্র ফাইলটি পড়তে হয় যখন এটি শেষ বার পড়ার পরে পরিবর্তিত হয়েছে। আশা করি এটি কাউকে সাহায্য করবে।

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;
}

অনুরূপ পন্থা লোগ 4 জে ব্যবহৃত হয় FileWatchdog


2

আপনি ফাইলরেডার ব্যবহার করে ফাইল পরিবর্তনগুলি শুনতে পারেন। Plz নীচের উদাহরণ দেখুন

// 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();
    }
}

2

যদি আপনি কিছু অর্থের সাথে অংশ নিতে ইচ্ছুক হন, জেএনআইআরাপার একটি উইনপ্যাক সহ একটি দরকারী লাইব্রেরি, আপনি নির্দিষ্ট ফাইলগুলিতে ফাইল সিস্টেম ইভেন্টগুলি পেতে সক্ষম হবেন। দুর্ভাগ্যক্রমে শুধুমাত্র উইন্ডোজ।

Https://www.teamdev.com/jniwrapper দেখুন ।

অন্যথায়, নেটিভ কোডটি অবলম্বন করা সবসময় খারাপ জিনিস হয় না বিশেষত যখন অফার সেরা হয় কোনও স্থানীয় অনুষ্ঠানের বিপরীতে পোলিংয়ের ব্যবস্থা।

আমি লক্ষ করেছি যে জাভা ফাইল সিস্টেম অপারেশনগুলি কয়েকটি কম্পিউটারে ধীর হতে পারে এবং যদি ভালভাবে পরিচালনা না করা হয় তবে সহজেই অ্যাপ্লিকেশনটির কার্যকারিতা প্রভাবিত করতে পারে।


1

আপনি অ্যাপাচি কমন্স জেসিআই (জাভা কম্পাইলার ইন্টারফেস) বিবেচনা করতে পারেন। যদিও এই এপিআই ক্লাসগুলির গতিশীল সংকলনের উপর দৃষ্টি নিবদ্ধ করে মনে হচ্ছে, এটিতে তার এপিআইতে এমন ক্লাসও অন্তর্ভুক্ত রয়েছে যা ফাইল পরিবর্তনগুলি পর্যবেক্ষণ করে।

উদাহরণ: http://commons.apache.org/jci/usage.html


1

স্প্রিং ইন্টিগ্রেশন ডিরেক্টরি এবং ফাইলগুলি দেখার জন্য একটি দুর্দান্ত প্রক্রিয়া সরবরাহ করে: http://static.springsource.org/spring-integration/references/htmlsingle/#files । খুব নিশ্চিত যে এটি ক্রস প্ল্যাটফর্ম (আমি এটি ম্যাক, লিনাক্স এবং উইন্ডোতে ব্যবহার করেছি)।


1

ফাইল এবং ফোল্ডারগুলির দেখার জন্য একটি বাণিজ্যিক ক্রস ডেস্কটপ লাইব্রেরি রয়েছে যার নাম JxFileWatcher। এটি এখান থেকে ডাউনলোড করা যাবে: http://www.teamdev.com/jxfilewatcher/

এছাড়াও আপনি অনলাইনে এটি ক্রিয়ায় দেখতে পাবেন: http://www.teamdev.com/jxfilewatcher/onlinesemo/


1

সর্বশেষ পরিবর্তিত ফাইল সম্পত্তি পোলিং যদিও একটি সহজ তবে কার্যকর সমাধান। আমার প্রসারিত শ্রেণিটি কেবলমাত্র সংজ্ঞায়িত করুন 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();
}

0

অন্যান্য উত্তরের মতো, এখানে ফাইল, টাইমার এবং টাইমার টাস্ক ব্যবহার করে এটি কীভাবে সেট করা হয়েছে তা নির্ধারিত বিরতিতে ব্যাকগ্রাউন্ড থ্রেড পোলিং হিসাবে চালাতে।

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);
    }

  }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.