يشارك هذا المثال رمز التنفيذ المحدد لقراءة تسجيل الدخول إلى المستخدم وتحميل الخادم للرجوع إليه. المحتوى المحدد كما يلي
يعمل العميل على خادم يوفر للمستخدم خدمات UNIX. تستخدم لقراءة وجمع المعلومات الأولية والمبتكرة للمستخدمين على الخادم ، وإقرانها وتنظيمها ، ثم إرسالها إلى الخادم للحصول على ملخص.
رمز التنفيذ المحدد:
1. dmsserver.java
حزمة com.dms ؛ استيراد java.io.bufferedReader ؛ استيراد java.io.file ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstreamreader ؛ import java.io.outputstreamwriter java.util.hashmap ؛ import java.util.list ؛ import java.util.map ؛ import java.util.concurrent.blockingqueue ؛ import java.util.concurrent.executorservice ؛ import java.util.concurrent.executors ؛ استيراد org.dom4j.document ؛ استيراد org.dom4j.Element ؛ استيراد org.dom4j.io.saxreader ؛ /** * خادم DMS ، يستخدم لتلقي * سجلات الاقتران المرسلة من قبل كل عميل وحفظها في ملف محلي * Author Administrator * */Public Class DMSServer {// Property Definition // Serversocket Serversocket Server المستخدم لتلقي الخادم المتصل بالعميل ؛ // pool pool المستخدمة لإدارة مؤشرات الترابط التي تتعامل مع طلبات العميل executorservice threadpool ؛ // احفظ جميع الملفات التي يتم إرسالها من قبل العملاء لإقران سجلات الملفات الخاصة serverlogfile ؛ // قائمة انتظار الرسائل blockequeue <Tring> messagequeue = new LinkedBlockingQueue <String> () ؛ Public DMSServer () يلقي الاستثناء {try {system.out.println ("الخادم تهيئة ...") ؛ // 1 تحليل خادم ملفات التكوين config.xml خريطة <string ، string> config = loadConfig () ؛ // 2 تهيئة السمة init (config) ؛ System.out.println ("تهيئة الخادم مكتملة ...") ؛ } catch (استثناء e) {system.out.println ("فشل التهيئة!") ؛ رمي ه ؛ }} / *** الخطوة الأولى في تهيئة طريقة المنشئ هي تحليل ملف التكوين* return يتم حفظ الخريطة التي تم إرجاعها في كل عنصر من عناصر من ملف التكوين ، حيث المفتاح: اسم العلامة ،* القيمة هي النص في منتصف العلامة* athrows استثناء* / خريطة خاصة <string> string> thross () throws استثناء {saxReader () مستند المستند = reader.read (ملف جديد ("server-config.xml")) ؛ العنصر جذر = doc.getRootElement () ؛ خريطة <string ، string> config = new hashmap <string ، string> () ؛ /** احصل على جميع الأدوات الفرعية في TAG <SIGNING> وحفظ اسم كل علامة فرعية كمفتاح ، والنص* في الوسط هو القيمة في مجموعة الخريطة*/ LIST <Element> list = root.elements () ؛ لـ (element e: list) {string key = e.getName () ؛ قيمة السلسلة = e.getTextTrim () ؛ config.put (المفتاح ، القيمة) ؛ } إرجاع التكوين ؛ } catch (استثناء e) {system.out.println ("حل استثناء ملف التكوين!") ؛ E.PrintStackTrace () ؛ رمي ه ؛ }} /** * الخطوة الثانية لتهيئة طريقة المنشئ هي تهيئة السمة وفقًا لعنصر التكوين * @param config * athrows استثناء * /private void init (map <string ، string> config) يلقي استثناء { / * * * تهيئة السمة مع puntribute-thoutter-shize- مخلوق. يتم استخدام هذه القيمة كعدد مؤشرات ترابط تجمع مؤشرات الترابط* تهيئة الخاصية باستخدام <sroperport> في ملف التكوين: الخادم ، وهنا هذه القيمة هي منفذ الخادم الخاص بـ ServersOction*/ this.server = New ServersOcket (integer.parseint (config.get ("serverport"))))) ؛ this.serverlogfile = ملف جديد (config.get ("logrecfile")) ؛ this.threadpool = evelopors.newFixedThreadPool (integer.parseint (config.get ("threadsum"))) ؛ } /** * طريقة البدء في العمل على الخادم * athrows استثناء * /public void Start () يلقي استثناء { / * * متطلبات التنفيذ: * أولاً ابدأ مؤشر ترابط بشكل منفصل لتشغيل saveloghandler * هذه المهمة هي حفظ جميع سجلات الاقتران * ثم ابدأ الاستماع إلى حلقة منافذ الخادم. بمجرد توصيل العميل ، * إنشاء إنشاء عميل ، ثم تسليم المهمة إلى مجموعة مؤشرات الترابط * لتعيين مؤشرات الترابط للتعامل مع التفاعل مع العميل. * */ try {system.out.println ("يبدأ الخادم في العمل ...") ؛ SavelogHandler SLH = New SavelogHandler () ؛ موضوع جديد (SLH) .start () ؛ بينما (صواب) {socket socket = server.accept () ؛ threadpool.execute (clientHandler جديد (مأخذ)) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ رمي ه ؛ }} public static void main (string [] args) {try {dmsserver server = new dmsserver () ؛ server.start () ؛ } catch (استثناء e) {system.out.println ("فشل المحطة في بدء تشغيل الخادم!") ؛ }}} / ** * هذا الموضوع مسؤول عن إحضار كل سجل مقترن من قائمة انتظار الرسائل ، * وحفظه في ملف serverlogfile * Author Administrator * * / private class saveloghandler ينفذ runnable {public void run () {printwriter pw = null ؛ حاول {pw = new printWriter (fileOutputStream جديد (serverLogFile ، true)) ؛ بينما (صحيح) {if (messageque.size ()> 0) {pw.println (messagequeue.poll ()) ؛ } آخر {pw.flush () ؛ thread.sleep (500) ؛ }}} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {if (pw! = null) {pw.close () ؛ }}} ستر ClientHandler Public (Socket Socket) {this.socket = socket ؛ } public void run () { / * * IDEA: * استقبل أولاً جميع السجلات المقترنة التي أرسلها العميل ، * حتى "Over" ، ثم احفظ هذه السجلات * المقترنة إلى الملف المحلي ، والرد على العميل * "OK" سلسلة "Over". إذا لم يكن الأمر كذلك ، فهو سجل مقترن ، وحفظه في الملف المحلي. إذا كان الأمر كذلك ، * توقف عن القراءة. * 4: الرد على العميل "موافق" بعد قراءة جميع السجلات */ printWriter pw = null ؛ جرب {// 1 pw = new printWriter (new OutputStreamWriter (socket.getOutputStream () ، "utf-8")) ؛ // 2 BufferedReader BR = جديد BufferedReader (New InputStreamReader (Socket.getInputStream () ، "UTF-8")) ؛ // 3 رسالة سلسلة = فارغة ؛ بينما ((message = br.readline ())! = null) {if ("Over" .equals (message)) {break ؛ } // اكتب السجل إلى ملف لحفظ messagequeue.offer (message) ؛ } // 4 pw.println ("ok") ؛ pw.flush () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ pw.println ("خطأ") ؛ pw.flush () ؛ } أخيرًا {try {// افصل من العميل لإصدار socket.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}}}}}}}}}}} 2. dmsclient.java
حزمة com.dms ؛ استيراد java.io.bufferedreader java.util.hashmap ؛ import java.util.list ؛ import java.util.map ؛ import java.util.map.entry ؛ import java.util.set ؛ استيراد org.dom4j.document ؛ استيراد org.dom4j.Element ؛ استيراد org.dom4j.io.saxreader ؛ استيراد com.dms.bo.logdata ؛ استيراد com.dms.bo.logrec ؛ /*** يعمل هذا العميل على الخادم الذي يوفر للمستخدمين خدمات UNIX. * تستخدم لقراءة وجمع معلومات Upstream و Hownstream للمستخدمين على الخادم ، و * إقرانها وفرزها وإرسالها إلى الخادم للحصول على ملخص. * Author Administrator * */Public Class DMSClient {// تعريف السمة // الخطوة 1: تحليل الخصائص المطلوبة من سجل ملفات سجل نظام Log // UNIX ؛ // احفظ ملف السجل الخاص المحلل النصفي textLogFile ؛ // Forkmark File File Private File LastPositionFile ؛ // عدد الإدخالات لكل سجل التحليل الخاص. // الخطوة 2: إقران سمات log // احفظ الملف الخاص ملف logrecfile ؛ // احفظ الملف الخاص ملف LoginLogFile ؛ // الخطوة 3: تحليل سمات Log // Server عنوان السلسلة الخاصة ؛ // Server Port Private Int Serverport ؛ /*** طريقة مُنشئ ، تستخدم لتهيئة العميل* athrows استثناء*/public dmsclient () يلقي الاستثناء {try {// 1 تحليل ملف التكوين config.xml خريطة <string> config> config = loadConfig () ؛ // foling system.out.println (config) ؛ // 2 تهيئة السمة init (config) ؛ } catch (استثناء e) {system.out.println ("فشل التهيئة!") ؛ رمي ه ؛ }} / ** * تهيئة الخطوة الثانية من طريقة المنشئ ، وقم بتهيئة السمات وفقًا لعنصر التكوين * @param config * athrows استثناء * / private void init (map <string ، string> config) يرمي استثناء {try {logfile = new file (config.get ("logfile") ؛ TextLogFile = ملف جديد (config.get ("textLogFile")) ؛ lastPositionFile = ملف جديد (config.get ("lastPositionFile")) ؛ batch = integer.parseint (config.get ("batch")) ؛ logrecfile = ملف جديد (config.get ("logrecfile")) ؛ loginlogfile = ملف جديد (config.get ("loginlogfile")) ؛ serverHost = config.get ("serverHost") ؛ serverport = integer.parseint (config.get ("serverport")) ؛ } catch (استثناء e) {system.out.println ("فشل خاصية التهيئة!") ؛ E.PrintStackTrace () ؛ رمي ه ؛ }} / ** * الخطوة الأولى في تهيئة طريقة المنشئ هي تحليل ملف التكوين * return يتم حفظ الخريطة التي تم إرجاعها في كل عنصر من عناصر من ملف التكوين ، حيث المفتاح: اسم العلامة ، * القيمة هي النص في منتصف tag * @therwes استثناء * / خريطة خاصة <string> string> load () throws stispion {try {saxReader = مستند المستند = reader.read (ملف جديد ("config.xml")) ؛ العنصر جذر = doc.getRootElement () ؛ خريطة <string ، string> config = new hashmap <string ، string> () ؛ /** احصل على جميع الأدوات الفرعية في علامة <Fispl>* واستخدم اسم كل علامة فرعية كمفتاح ، يتم تخزين* في النص الأوسط في مجموعة الخريطة كقيمة*/ قائمة <Element> list = root.elements () ؛ لـ (element e: list) {string key = e.getName () ؛ قيمة السلسلة = e.getTextTrim () ؛ config.put (المفتاح ، القيمة) ؛ } إرجاع التكوين ؛ } catch (استثناء e) {system.out.println ("استثناء ملف التكوين الحاجز!") ؛ E.PrintStackTrace () ؛ رمي ه ؛ }} / *** طريقة للعميل لبدء العمل* ثلاث خطوات من الحلقة:* 1: تحليل السجل* 2: إقران السجل* 3: إرسال السجل* / public void start () {parselogs () ؛ Matchlogs () ؛ sendlogs () ؛ // بينما (صواب) {// // parse log // if (! parselogs ()) {// contert ؛ //} // // log log //// if (! matchlogs ()) {// report ؛ //} // send log // sendlogs () ؛ //} فشل* / خاص SendLogs () { /*** فكرة التنفيذ:* اقرأ جميع السجلات المقترنة في ملف logrecfile* واتصل إلى الخادم وإرساله ، إذا كان الخادم* تلقيها جميعًا ، فيمكنك حذف الملف ، مما يعني أنه تم الانتهاء من إرسال*. * خطوات التنفيذ:* 1: يجب أن يكون ملف logrecfile موجودًا* 2: اقرأ وتخزين جميع السجلات المقترنة في مجموعة* انتظر إرسال* 3: الاتصال بالخادم من خلال المقبس* 4: إنشاء دفق الإخراج* 5: إرسال جميع سجلات المقترنة في تسلسل الإدخال في الخادم* 6: إرسال سلسلة واحدة "أكثر" للإشارة إلى أن جميع السجلات قد تم إرسالها* 7: "OK" ، فهذا يعني أن الخادم طبيعي * قد تلقى جميع السجلات ، ثم يمكن حذف ملف Logrecfile * وإعادته يعني أن الإرسال قد اكتمل. * */ Socket Socket = NULL ؛ حاول {// 1 if (! logrecfile.exists ()) {system.out.println (logrecfile+"غير موجود!") ؛ العودة كاذبة } // 2 list <string> matches = ioutil.loadlogrec (logrecfile) ؛ // 3 Socket = Socket (ServerHost ، ServerPort) ؛ // 4 printwriter pw = new printWriter (new OutputStreamWriter (socket.getOutputStream () ، "utf-8")) ؛ // 5 for (string log: matches) {pw.println (log) ؛ } // 6 pw.println ("Over") ؛ pw.flush () ؛ // 7 bufferredreader br = new BufferedReader (new inputStreamReader (socket.getInputStream () ، "utf-8")) ؛ // 8 string response = br.readline () ؛ // 9 if ("ok" .equals (response)) {logrecfile.delete () ؛ العودة صحيح. } آخر {system.out.println ("إرسال السجل فشل!") ؛ العودة كاذبة }} catch (استثناء e) {system.out.println ("Send log failed!") ؛ E.PrintStackTrace () ؛ } أخيرًا {if (socket! = null) {try {socket.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} إرجاع خطأ ؛ } /*** الخطوة 2: إقران log* @RETURN TRUE: الاقتران بنجاح* خطأ: فشل الاقتران* /private Boolean Matchlogs () { /** فكرة التنفيذ:* اقرأ كل السجل الجديد الذي تم تحليله في الخطوة الأولى مع سجل تسجيل الدخول الذي تم إقرانه الأخير بنجاح* ، ثم اتبع المستخدم ،* نفس السجل ، واحد هو 7 والآخر هو 8 للزواج. * طالما يمكنك العثور على نوع 8 ، يمكنك العثور على سجل تسجيل الدخول يمكن إقرانه بـ *. * * خطوات التنفيذ: * 1: الحكم اللازم * 1.1: ما إذا كان logrecfile موجود. إذا كان موجودًا ، فلن يتم تنفيذ أعمال الاقتران الجديدة لتجنب الكتابة فوقها. * 1.2: يجب وجود ملف textLogFile. * 2: اقرأ textlogfile وقراءة السجلات و * إلى المجموعة. (العديد من مثيلات logdata)* 3: في حالة وجود ملف loginlogfile ، فهذا يعني* هناك سجل لم يتم إقرانه بنجاح في المرة الأخيرة ، ويتم قراءته أيضًا* ويتم حفظه في المجموعة في انتظار أن يتم إقرانها معًا* 4: إقران العمل* 4.1: إنشاء مجموعة من السجلات المقترنة* 4.2 تسجيل الدخول والتسجيل * * حيث المفتاح: المستخدم ، PID * القيمة: مثيل logData * 4.4: اجتياز خريطة تسجيل الدخول ، والعثور على تسجيل الدخول المقابل في خريطة تسجيل الدخول وفقًا لمفتاح كل سجل تسجيل الدخول ، و * احفظ السجل المقترن في مجموعة السجلات المقترنة. وحذف سجل تسجيل الدخول في السجل المقترن* من خريطة تسجيل الدخول. وبهذه الطريقة ، ** يجب ألا يكون لديك أي إقران فقط عند تسجيل الدخول إلى الخريطة. * 5: كتابة سجلات مقترنة إلى logrecfile* 6: اكتب جميع السجلات غير المقيدة إلى loginlogfile* 7: حذف ملف textlogfile* 8: إرجاع صحيح ، مما يشير إلى أن الاقتران قد اكتمل*/try {// 1 //1.1 if (logrecfile.exists ()) {return true ؛ } //1.2 if (! textlogfile.exists ()) {system.out.println (textLogFile+"غير موجود!") ؛ العودة كاذبة } // 2 LIST <LOGDATA> list = ioutil.loadlogdata (textLogFile) ؛ // 3 if (loginlogfile.exists ()) {list.addall (ioutil.loadlogdata (loginlogfile)) ؛ } // 4 //4.1 LIST <LOGREC> matches = new ArrayList <LoGrec> () ؛ //4.2 map <string ، logData> loginMap = new HashMap <string ، logData> () ؛ خريطة <string ، logData> logoutMap = new hashmap <string ، logData> () ؛ //4.3 لـ (logData logData: list) {string key = logData.getuser ()+ "،"+ logData.getPid () ؛ if (logData.getType () == logData.type_login) {loginMap.put (المفتاح ، logData) ؛ } آخر إذا (logData.getType () == logData.type_logout) {logoutMap.put (المفتاح ، logData) ؛ }} //4.4 SET <interpt <string ، logData >> intplesset = logoutMap.EntrySet () ؛ لـ (إدخال <string ، logData> e: entrateSet) {logData logout = e.getValue () ؛ logData login = loginMap.Remove (e.getKey ()) ؛ LOGREC LOGREC = NEW LOGREC (تسجيل الدخول ، تسجيل الدخول) ؛ Matches.Add (Logrec) ؛ } // 5 ioutil.saveCollection (المباريات ، logrecfile) ؛ // 6 ioutil.savecollection (loginMap.values () ، loginlogfile) ؛ // 7 textlogfile.delete () ؛ // 8 إرجاع صحيح ؛ } catch (استثناء e) {system.out.println ("فشل سجل الاقتران!") ؛ E.PrintStackTrace () ؛ } إرجاع خطأ ؛ } /*** الخطوة 1: تحليل السجل* @RETURN TRUE: تحليل ناجح* خطأ: فشل التحليل* /private boolean parselogs () { /** فكرة التنفيذ:* حلقة القراءة سجلات الدُفعات ، ثم التحليل* 5 معلومات في كل سجل ، وتكوين سلسلة ، واكتبها إلى ملف textlogfile في* وحدات السلوك*. ومع ذلك ، و * الخطوة الأولى تكرر التنفيذ ، مما تسبب في كتابة السجل السابق * ، تحتاج إلى الحكم هنا. إذا قمت بحفظ السجل المحسّن* يوجد ملف السجل ، ولن يتم تنفيذ الخطوة الأولى. * سيتم حذف ملف السجل هذا بعد إقران الخطوة الثانية. * 1.2: يجب أن يكون ملف ملف logfile موجودًا (ملف wtmpx) * 1.3: هل لا يزال هناك سجل يمكن تحليله * 2: إنشاء عشوائي لقراءة ملف logfile * 3: انقل المؤشر إلى آخر موقع للقراءة ، قم بإعداد * بدء تشغيل العمل الجديد * في كل سجل (المستخدم ، PID ، الكتابة ، الوقت ، المضيف) * وحفظه مع مثيل logData ، ثم حفظ * مثيل LogData في المجموعة * 5: حفظ جميع السجلات في المجموعة في وحدات السلوك إلى * textlogfile * 6: حفظ معلومات إشارة مرجعية * 7: إرجاع صحيح ، مما يشير إلى أن العمل مكتمل */ عشوائي RAF = null ؛ حاول {// 1 //1.1 if (textLogFile.exists ()) {return true ؛ } //1.2 if (! logfile.exists ()) {system.out.println (logfile+"غير موجود!") ؛ العودة كاذبة } //1.3 long lastposition = haslogs () ؛ // poling // system.out.println (// "lastPosition:"+lastPosition //) ؛ if (lastposition <0) {system.out.println ("لا يمكن تحليل أي سجلات!") ؛ العودة كاذبة } // 2 raf = new RandomAccessFile (logfile ، "r") ؛ // 3 raf.seek (lastposition) ؛ // 4 LIST <LOGDATA> list = new ArrayList <DogData> () ؛ لـ (int i = 0 ؛ i <batch ؛ i ++) {// قبل كل تحليل ، حدد ما إذا كانت هناك سجلات يمكن تحليلها إذا (logfile.length ()-lastPosition <logData.log_length) {break ؛ } // parse user raf.seek (lastPosition+logData.user_offset) ؛ string user = ioutil.readString (raf ، logData.user_length) .trim () ؛ // parse pid raf.seek (lastPosition+logData.pid_offset) ؛ int pid = raf.readint () ؛ // parse type raf.seek (lastPosition+logData.type_offset) ؛ نوع قصير = raf.readshort () ؛ // parse time raf.seek (lastPosition+logData.Time_offset) ؛ int time = raf.readint () ؛ // Paste Host Raf.Seek (LastPosition+logData.host_offset) ؛ سلسلة مضيف = ioutil.readString (RAF ، logData.host_length) .trim () ؛ logData log = new logData (المستخدم ، pid ، type ، time ، host) ؛ list.add (log) ؛ // poling // system.out.println (log) ؛ // تحميل سجل ، تحديث lastPosition lastPosition = raf.getFilePointer () ؛ } // 5 ioutil.savecollection (قائمة ، textLogFile) ؛ // 6 حفظ ملف الإشارة المرجعية ioutil.savelong (lastPosition ، lastPositionFile) ؛ // 7 إرجاع صحيح ؛ } catch (استثناء e) {system.out.println ( E.PrintStackTrace () ؛ } أخيرًا {if (raf! = null) {try {raf.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} إرجاع خطأ ؛ } /*** الخطوة الأولى هي تحليل رابط في السجل. * وفقًا لموقع سجل ملف الإشارة المرجعية ، حدد ما إذا كان لا يزال هناك * سجل لتحليله. إذا كان هناك ، سيتم إرجاع الموقف الأخير*. إذا كان هناك لا ، العودة -1. * @return */ private long haslogs () {try {/ * * * إذا لم يكن lastPositionFile غير موجود ، فهذا يعني أنه لم يتم تحليله * ، حتى تتمكن من تحليل من البداية */ if (! lastpositionfile.exists ()) {return 0 ؛ } Long LastPosition = ioutil.readlong (lastPositionFile) ؛ if (logfile.length ()-lastPosition> = logData.log_length) {return lastPosition ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } العودة -1 ؛ } public static void main (string [] args) {try {dmsclient client = new dmsclient () ؛ client.start () ؛ } catch (استثناء e) {system.out.println ("فشل تشغيل العميل!") ؛ }}} 3. ioutil.java
حزمة com.dms ؛ استيراد java.io.bufferedreader ؛ استيراد java.io.file ؛ استيراد java.io.fileinputStream ؛ استيراد java.io.inputstreamread ؛ استيراد java.io.printwriter ؛ استيراد java.io.randomaccessfile com.dms.bo.logdata ؛ /** * هذه الفئة عبارة عن فئة أدوات مسؤولة عن عمليات العميل IO * Author Administrator * */public class ioutil {/** * اقرأ كل سطر من السلسلة من الملف المحدد (log pair) * وحفظ مجموعة لإرجاع ملف * param * return * thrats requestation */public static list <string> loadlogrec (file file) throws { حاول {br = new BufferedReader (New inputStreamReader (FileInputStream (file))) ؛ قائمة <Tring> list = new ArrayList <String> () ؛ خط السلسلة = فارغ ؛ بينما ((line = br.readline ())! = null) {list.add (line) ؛ } قائمة الإرجاع ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي ه ؛ } أخيرًا {if (br! = null) {br.close () ؛ }}} /** * اقرأ كل سجل مقترن من الملف المحدد وحفظه في مجموعة * ثم العودة. * param file * regurn * @throws استثناء */ قائمة ثابتة عامة <logData> loadlogdata (ملف الملف) يلقي استثناء {bufferedReader br = null ؛ حاول {br = new BufferedReader (New inputStreamReader (FileInputStream (file))) ؛ قائمة <LogData> list = new ArrayList <DogData> () ؛ خط السلسلة = فارغ ؛ بينما ((line = br.readline ())! = null) {logData logData = new logData (line) ؛ list.add (logData) ؛ } قائمة الإرجاع ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي ه ؛ } أخيرًا {if (br! = null) {br.close () ؛ }}} / ** * اكتب القيمة الطويلة المحددة في السطر الأول من الملف المحدد كسلسلة * param l * param * athrows استثناء * / public static void savelong (long lon ، file file) يلقي stispion {printWriter pw = null ؛ حاول {pw = new printWriter (file) ؛ pw.println (lon) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي ه ؛ } أخيرًا {if (pw! = null) {pw.close () ؛ }}}} /*** اكتب السلسلة التي تم إرجاعها بواسطة طريقة toString لكل عنصر في المجموعة إلى الملف المحدد في وحدات السلوك. * param c * param file * athrows استثناء */ public static void savecollection (collection c ، file file) rems {printWriter pw = null ؛ حاول {pw = new printWriter (file) ؛ لـ (Object o: c) {pw.println (o) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ رمي ه ؛ } أخيرًا {if (pw! = null) {pw.close () ؛ }}} / ** * ابدأ مستمرًا من الموضع الحالي من بايتات طول عشوائية معطى * وقراءة وتحويلها إلى سلسلة وإرجاعها * param raf * @param length * @thrate * / stating string static readString (landlyaccessfile raf ، int int) استثناء {try {try {try {try {try {trawe engual = enmale] ؛ RAF.READ (DATA) ؛ إرجاع سلسلة جديدة (البيانات ، "ISO8859-1") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي ه ؛ }} / ** * اقرأ السطر الأول من السلسلة من الملف المحدد ثم * return * param file * regurn * @throws استثناء * / public static readlong (ملف) يلقي استثناء {bufferedreader br = null ؛ حاول {br = new BufferedReader (New inputStreamReader (FileInputStream (file))) ؛ خط السلسلة = br.readline () ؛ العودة long.parselong (الخط) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ رمي ه ؛ } أخيرًا {if (br! = null) {br.close () ؛ }}}}
4. config.xml
<؟ عدد الإدخالات لكل سجل محدود-> <Batch> 10 </batch> <!-اسم ملف السجل المقترن-> <LogreCfile> logrec.txt </logrecfile> <!-اسم ملف السجل غير المقترح-> <goginlogfile> login.txt </loginlogfile> <!- <GoginLogFile> login.txt </loginlogfile> <!-عنوان الخادم-> <ServerHost> localhost </sroperhost> <!-منفذ الخادم-> <sroperport> 8088 </serverport> </config>
5. خادم config.xml
<؟
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.