ফাইল সিস্টেমে কোনও ফাইল পরিবর্তন করা হলে আমি অবহিত হতে চাই। আমি সর্বশেষ odষত ফাইলের সম্পত্তি পোল করে এমন থ্রেড ছাড়া কিছুই পাইনি এবং স্পষ্টতই এই সমাধানটি অনুকূল নয়।
ফাইল সিস্টেমে কোনও ফাইল পরিবর্তন করা হলে আমি অবহিত হতে চাই। আমি সর্বশেষ odষত ফাইলের সম্পত্তি পোল করে এমন থ্রেড ছাড়া কিছুই পাইনি এবং স্পষ্টতই এই সমাধানটি অনুকূল নয়।
উত্তর:
নিম্ন স্তরে এই ইউটিলিটির মডেল করার একমাত্র উপায় হ'ল ডিরেক্টরিতে থ্রেড পোলিং করা এবং ফাইলের বৈশিষ্ট্যগুলিতে নজর রাখা। তবে আপনি এই জাতীয় ইউটিলিটির জন্য অ্যাডাপ্টার বিকাশ করতে প্যাটার্নগুলি ব্যবহার করতে পারেন।
উদাহরণস্বরূপ j2ee অ্যাপ্লিকেশন সার্ভারের মতো টমক্যাট এবং অন্যদের মধ্যে একটি অটো লোড বৈশিষ্ট্য রয়েছে যেখানে স্থাপনার বিবরণী পরিবর্তন বা সার্লেট শ্রেণীর সাথে সাথে অ্যাপ্লিকেশন পুনরায় আরম্ভ হবে।
টমক্যাটের বেশিরভাগ কোড পুনরায় ব্যবহারযোগ্য এবং ওপেনসোর্স হিসাবে আপনি যেমন সার্ভারগুলি থেকে গ্রন্থাগারগুলি ব্যবহার করতে পারেন।
আমি এর আগে একটি লগ ফাইল মনিটর লিখেছি এবং আমি দেখতে পেয়েছি যে একটি একক ফাইলের বৈশিষ্ট্যগুলি, কয়েক সেকেন্ডে কয়েকবার ভোটদানের সিস্টেমের কার্য সম্পাদনের উপর প্রভাবটি আসলে খুব কম।
জাভা 7, এনআইও 2 এর অংশ হিসাবে ওয়াচ সার্ভিস এপিআই যুক্ত করেছে
ওয়াচ সার্ভিস এপিআই অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা হয়েছে যা ফাইল পরিবর্তন ইভেন্টগুলি সম্পর্কে অবহিত হওয়া দরকার।
আমি অ্যাপাচি কমন্স থেকে ভিএফএস এপিআই ব্যবহার করি, পারফরম্যান্সে খুব বেশি প্রভাব ছাড়াই কোনও ফাইলকে কীভাবে পর্যবেক্ষণ করা যায় তার উদাহরণ এখানে:
একটা শান্ত করে বলা হয় jnotify যে গোপন inotify লিনাক্স এবং উইন্ডোজের জন্য সমর্থন আছে। এটি কখনই ব্যবহার করা হয়নি এবং আমি জানি না এটি কতটা ভাল, তবে আমি বলার চেষ্টা করার মতো এটি worth
জাভা কমন্স-আইও-তে একটি ফাইলএল্টেরেশনঅবার্সবার রয়েছে । এটি ফাইলএল্টেরেশনমনিটরের সাথে একত্রে ভোটদান করে। কমন্স ভিএফএসের মতো। সুবিধাটি হ'ল এর অনেক কম নির্ভরতা রয়েছে।
সম্পাদনা করুন: কম নির্ভরতা সত্য নয়, তারা ভিএফএসের জন্য alচ্ছিক। তবে এটি ভিএফএস অ্যাস্ট্রাকশন স্তরের পরিবর্তে জাভা ফাইল ব্যবহার করে।
অন্তর্নিহিত ওএসের উপর নির্ভরশীলতার সাথে "আরও এনআইও বৈশিষ্ট্যগুলি" ফাইলের ঘড়ির কার্যকারিতা রয়েছে। জেডিকে 7 তে হওয়া উচিত।
java.nio.file
। একটি টিউটোরিয়াল দেখুন ।
আমি যখনই এই বৈশিষ্ট্যের ফাইলটি পড়তে যাই আমি কোডের এই স্নিপেটটি চালিত করি, কেবলমাত্র ফাইলটি পড়তে হয় যখন এটি শেষ বার পড়ার পরে পরিবর্তিত হয়েছে। আশা করি এটি কাউকে সাহায্য করবে।
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
।
আপনি ফাইলরেডার ব্যবহার করে ফাইল পরিবর্তনগুলি শুনতে পারেন। 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();
}
}
যদি আপনি কিছু অর্থের সাথে অংশ নিতে ইচ্ছুক হন, জেএনআইআরাপার একটি উইনপ্যাক সহ একটি দরকারী লাইব্রেরি, আপনি নির্দিষ্ট ফাইলগুলিতে ফাইল সিস্টেম ইভেন্টগুলি পেতে সক্ষম হবেন। দুর্ভাগ্যক্রমে শুধুমাত্র উইন্ডোজ।
Https://www.teamdev.com/jniwrapper দেখুন ।
অন্যথায়, নেটিভ কোডটি অবলম্বন করা সবসময় খারাপ জিনিস হয় না বিশেষত যখন অফার সেরা হয় কোনও স্থানীয় অনুষ্ঠানের বিপরীতে পোলিংয়ের ব্যবস্থা।
আমি লক্ষ করেছি যে জাভা ফাইল সিস্টেম অপারেশনগুলি কয়েকটি কম্পিউটারে ধীর হতে পারে এবং যদি ভালভাবে পরিচালনা না করা হয় তবে সহজেই অ্যাপ্লিকেশনটির কার্যকারিতা প্রভাবিত করতে পারে।
আপনি অ্যাপাচি কমন্স জেসিআই (জাভা কম্পাইলার ইন্টারফেস) বিবেচনা করতে পারেন। যদিও এই এপিআই ক্লাসগুলির গতিশীল সংকলনের উপর দৃষ্টি নিবদ্ধ করে মনে হচ্ছে, এটিতে তার এপিআইতে এমন ক্লাসও অন্তর্ভুক্ত রয়েছে যা ফাইল পরিবর্তনগুলি পর্যবেক্ষণ করে।
স্প্রিং ইন্টিগ্রেশন ডিরেক্টরি এবং ফাইলগুলি দেখার জন্য একটি দুর্দান্ত প্রক্রিয়া সরবরাহ করে: http://static.springsource.org/spring-integration/references/htmlsingle/#files । খুব নিশ্চিত যে এটি ক্রস প্ল্যাটফর্ম (আমি এটি ম্যাক, লিনাক্স এবং উইন্ডোতে ব্যবহার করেছি)।
ফাইল এবং ফোল্ডারগুলির দেখার জন্য একটি বাণিজ্যিক ক্রস ডেস্কটপ লাইব্রেরি রয়েছে যার নাম JxFileWatcher। এটি এখান থেকে ডাউনলোড করা যাবে: http://www.teamdev.com/jxfilewatcher/
এছাড়াও আপনি অনলাইনে এটি ক্রিয়ায় দেখতে পাবেন: http://www.teamdev.com/jxfilewatcher/onlinesemo/
সর্বশেষ পরিবর্তিত ফাইল সম্পত্তি পোলিং যদিও একটি সহজ তবে কার্যকর সমাধান। আমার প্রসারিত শ্রেণিটি কেবলমাত্র সংজ্ঞায়িত করুন 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();
}
অন্যান্য উত্তরের মতো, এখানে ফাইল, টাইমার এবং টাইমার টাস্ক ব্যবহার করে এটি কীভাবে সেট করা হয়েছে তা নির্ধারিত বিরতিতে ব্যাকগ্রাউন্ড থ্রেড পোলিং হিসাবে চালাতে।
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);
}
}
}