في الآونة الأخيرة ، واجهت الحاجة إلى تحميل الملفات إلى خوادم Linux أثناء إعادة التطوير ، والآن قمت بفرز ملاحظات الكود.
تأخذ طريقة الاتصال هذه في الاعتبار مشكلة التزامن ، وعند إنشاء اتصال FTP ، يتم تخزين كل كائن اتصال في
ThreadLocal <ftp> للتأكد من أن كل مؤشر ترابط ليس له أي تأثير على فتح وإغلاق FTP.
package com.test.utils ؛ import java.io.bufferedInputStream ؛ import java.io.file ؛ import java.io.filefilter ؛ import java.io.fileInputStream ؛ import java.io.inputstream ؛ import java.util.ArayLister ؛ org.apache.commons.logging.log ؛ استيراد org.apache.commons.logging.logfactory ؛ استيراد com.jcraft.jsch.channelsftp ؛ استيراد com.jcraft.jsch.jsch ؛ استيراد com.jcraft.sch logfactory.getLog (ftp.class) ؛ تاريخ ثابت خاص last_push_date = null ؛ جلسة خاصة sshsession ؛ قناة القنوات الخاصة. private static threadlocal <Ftp> sftplocal = new threadlocal <ftp> () ؛ FTP الخاص (مضيف سلسلة ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة) يلقي الاستثناء {jsch jsch = new jsch () ؛ jsch.getsession (اسم المستخدم ، مضيف ، ميناء) ؛ // الحصول على جلسة sshsession = jsch.getSession (اسم المستخدم ، المضيف ، الميناء) ؛ sshsession.setPassword (كلمة المرور) ؛ . // تعيين خصائص لكائن الجلسة. عند الوصول إلى الخادم لأول مرة ، لا تحتاج إلى إدخال نعم sshsession.setConfig ("StricThostkeyChecking" ، "لا") ؛ sshsession.connect () ؛ // احصل على قناة SFTP = (Channelsftp) sshsession.openchannel ("SFTP") ؛ channel.connect () ؛ logger.info ("Connected FTP بنجاح!" + sshSession) ؛ } / ** * هل هو متصل * * return * / private boolean isConnected () {return null! = Channel && channel.isconnected () ؛ } /** * احصل على عميل SFTP المخزّن في مؤشر الترابط المحلي * * RETURN * @Throws استثناء * /Public Static FTP GetSftputil (مضيف سلسلة ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة) يلقي استثناء {// الحصول على مؤشر ترابط المحلي ftp sftputil = sftplocal.get () ؛ if (null == sftputil ||! sftputil.isconnected ()) {// منع الاتصال الجديد لمنع الموضوع المحلي وتنفيذ المعالجة المتزامنة sftplocal.set (FTP جديد (مضيف ، منفذ ، اسم المستخدم ، كلمة المرور)) ؛ } return sftplocal.get () ؛ } / *** حرر عميل SFTP الذي يخزن مؤشر الترابط المحلي* / public static void release () {if (null! = sftplocal.get ()) {sftplocal.get (). closechannel () ؛ logger.info ("Close Connection" + sftplocal.get (). sshSession) ؛ sftplocal.set (null) ؛ }} / ** * إغلاق قناة * * Throws استثناء * / public void rainechannel () {if (null! = channel) {try {channel.disconnect () ؛ } catch (استثناء e) {logger.error ("حدث استثناء عند إغلاق قناة SFTP:" ، e) ؛ }} if (null! = sshSession) {try {sshsession.disconnect () ؛ } catch (استثناء e) {logger.error ("SFTP Close Session استثناء:" ، e) ؛ }}} /*** @Param Directory الدليل لتحميل ftp* param eploadfile دليل الملف المحلي** /public void upload (دليل السلسلة ، exploadfile) يلقي استثناء {try {<br> // تنفيذ قائمة display ls command.ls (directory) ؛ <br> قائمة <IPER> ملفات = getFiles (UploadFile ، ArrayList New ArrayList <IPER> ()) ؛ لـ (int i = 0 ؛ i <files.size () ؛ i ++) {file file = files.get (i) ؛ inputStream input = جديد bufferedInputStream (FileInputStream جديد (ملف)) ؛ channel.put (input ، file.getName ()) ؛ حاول {if (input! = null) input.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ logger.error (file.getName () + "استثناء عند إغلاق الملف ... استثناء!" + E.GetMessage ()) ؛ } if (file.exists ()) {boolean b = file.delete () ؛ logger.info (file.getName () + "تم تحميل الملف! حذف معرف:" + b) ؛ }}}} catch (استثناء e) {logger.error ("[يتم إنشاء الدليل الفرعي]:" ، e) ؛ // إنشاء القناة الفرعية. mkdir (دليل) ؛ }} // احصل على قائمة ملفات عامة <file> getFiles (String RealPath ، قائمة <file> ملفات) {file realfile = new file (RealPath) ؛ if (realFile.isDirectory ()) {file [] subfiles = RealFile.ListFiles (filefilter () {Override public boolean قبول (ملف) {if (null == last_push_date) {return true ؛ }) ؛ لـ (ملف الملف: subfiles) {if (file.isdirectory ()) {getFiles (file.getabsolutepath () ، files) ؛ } آخر {files.add (file) ؛ } if (null == last_push_date) {last_push_date = new date (file.lastmodified ()) ؛ } آخر {long modifyDate = file.lastmodified () ؛ if (modifyDate> last_push_date.gettime ()) {last_push_date = تاريخ جديد (modifyDate) ؛ }}}} إرجاع الملفات ؛ }}لخص
ما سبق هو اتصال Java عن بُعد إلى Linux Server ، وقم بتنفيذ الأوامر وتحميل الملفات التي قدمها المحرر. آمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، يرجى ترك رسالة لي. سوف يرد المحرر على الجميع في الوقت المناسب!