في الآونة الأخيرة ، أقوم بتقديم متطلبات: قم بتنزيل الملف الذي يقوم بتخزين عنوان URL للصور من دليل FTP للأنظمة الأخرى ، ثم اقرأ عنوان عنوان URL في الملف ، وقم بتنزيل الصورة وفقًا للعنوان وضغطه في حزمة في يوم واحد. في المتوسط ، يحتوي ملف عنوان واحد على حوالي 4000 عنوان. وهذا يعني ، بعد مسح ملف ، تحتاج إلى تنزيل حوالي 4000 صورة ، ثم ضغطه. السجلات التالية طريقة التنفيذ الخاصة بي وعملية التحسين. إذا كان لديك أي طرق أفضل ، فيمكنك مشاركتها.
الإطار المستخدم: springMVC
تنفيذ المهمة الموقوتة: org.springframework.scheduling.quartz.quartzjobbean ؛
لن أتحدث عن بناء بيئة FTP. لقد قمت بتسجيلها في المدونات الأخرى التي أستخدمها خدمة FTP التي صممها CentOS في الجهاز الظاهري لإنشاء حساب FTP والدليل المقابل ، وتحميل ملف عنوان الصورة الذي يحتاج إلى تنزيله مسبقًا. تنسيق محتوى الملف "معرف الصورة || عنوان الصورة".
الطريقة 1. أسهل طريقة لتنفيذها هي تنزيل الملف أولاً الذي يخزن عنوان عنوان URL للصورة ، ثم اقرأ ملف تعريف الملف عنوان الصورة ، وضبط طريقة الصورة التي تم تنزيلها لتخزين الصورة محليًا ، وأخيراً ضغط الصورة التي تم تنزيلها. بعد الانتهاء ، حذف الصورة التي تم تنزيلها ، واحتفظ فقط بالحزمة المضغوطة.
يمتد PictureTransferJob من الطبقة العامة QuartzJobbean {encuteiNteral executeInternal المحمية (JobexecutionContext arg0) يلقي JobexecutionException {// يتم الحصول على تكوين FTP الفعلي عن طريق قراءة ملف التكوين // ftp string stistname = "192.168.1.1.112" ؛ // ftp port port = 2001 ؛ /ftp account string username = "test1" ؛ // ftp password string password = "test1" ؛ // FTP File Storage Directory String ftpDowload = "/" ؛ // مسار التخزين المحلي لمسار سلسلة الملف = this.getClass (). getResource ("/"). getPath () ؛ . . addrpath = addrpath.replace ("٪ 20" ، "") ؛ picpath = picpath.replace ("٪ 20" ، "") ؛ حاول {// إنشاء ملف streamfile (addrpath) ؛ // إنشاء ملف streamfile (picpath) ؛ String OldAddRath = addrpath ؛ String OldPAPTH = PICPATH ؛ // قم بإنشاء اتصال FTP ftputil2 ftputil2 = new ftputil2 (اسم المضيف ، المنفذ ، اسم المستخدم ، كلمة المرور ، ftpdowload ، true) ؛ // transf الملف في سلسلة دليل FTP []] = ftputil2.listallfiles () ؛ // سيكون لقاعدة البيانات المحلية سجل جدول للملفات التي تم تنزيلها. سنقوم هنا بالاستعلام عن قاعدة البيانات وأسماء الملفات المدرجة في FTP. إذا لم يتم تنزيل الملفات التي تم تنزيلها ، وتجنب التنزيلات المتكررة. // تم حذف عملية المقارنة أدناه ، وقم بتدوين صفيف الملفات ، وإنشاء الملف محليًا لـ (int i = 0 ؛ i <files.length ؛ i ++) {addrpath+file.separator+filename) ؛ // ftpdowload هو عنوان خادم FTP لتخزين الملف ، فإن AddRpath هو عنوان ملف التخزين المحلي // هنا حالة إرجاع لتحديد ما إذا كان يتم تنزيل الملف بنجاح boolean downloadInvestorFlag = ftputil2.downloadFile (ftpdowload ، addrpath) ؛ . }} catch (استثناء e) {E.PrintStackTrace () ؛ . System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- String row; العد int = 0 ؛ addrmap.pt (0]. System.out.println (Date ()) ؛ System.out.println ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ e.printstacktrace () ؛ picaddr = null ؛ بايت صفيف من خلال الإدخال وسيخسر البيانات ، مما يؤدي إلى تحميل الصور. صفيف البايت ، وبعد القراءة ، تم مسح البيانات في PICPATH+". is.close () ؛ Zippic (picpath ، syncdate ، addrmap) ؛ {// توقف في قائمة الملفات التي يجب ضغطها واسم الملف المضغوط ziputil.zipbystream (piclist ، ملف جديد (picpath+syndate+". zip") ؛ if (! file.exists ()) {file.mkdirs () ؛ الطريقة 2: تنزيل متعدد الخيوط ، ضغط مباشر للتدفقات
الطريقة 1 على الرغم من تنفيذ الوظائف الأساسية ، لأن هناك الكثير من الصور التي تحتاج إلى تنزيلها ، وضغط ملفات الصور المحلية وحذف الصور أيضًا يستغرق وقتًا طويلاً ، لذلك هناك مكانان يمكنك فيه تحسين السرعة. أحدهما هو تحسين كفاءة تنزيل الصور ، والآخر هو تحسين كفاءة الضغط.
يمكن أن تستخدم طريقة تحسين كفاءة التنزيل تنزيلات متعددة الخيوط ، ويمكن أن تؤدي الطريقة لتحسين كفاءة الضغط إلى ضغط دفق الملفات مباشرة دون حفظ الصورة محليًا.
طريقة التنفيذ متعددة الخيوط: أولاً ، نقوم بحفظ قائمة العناوين للملفات التي يجب تنزيلها. إذا كنا نريد استخدام متعدد الخيوط للتنزيل ، فيجب علينا التأكد من عدم تكرار الصور التي تم تنزيلها بواسطة مؤشرات ترابط مختلفة. لذلك ، هناك حاجة إلى العلم لتمييزهم. في هذا الوقت ، يمكننا استخدام عداد فهرس لتقسيمها وفقًا لمقدار معين من الصور التي تم تنزيلها بواسطة كل موضوع. بدءًا من 0 ، كل 400 صورة ، يمكننا استخدام مؤشر ترابط واحد لتنزيله في كل مرة ، حتى نتمكن من تحديد عدد مؤشرات الترابط المطلوبة ، ولن تتكرر الصور التي تم تنزيلها بواسطة كل مؤشر ترابط.
طريقة التنفيذ للملفات المضغوطة: نظرًا لأن جوهر توليد الملفات المضغوطة هو قراءة دفق الملف الذي يحتاج إلى ضغط ، ثم إنشاء حزمة مضغوطة ، يمكننا استخدام الحاوية لتخزين بيانات دفق الصور التي تم تنزيلها بواسطة جميع مؤشرات الترابط بدلاً من إنشاء ملف الصورة الذي تم تنزيله ، ثم تمريرها إلى فئة بيانات الدفق إلى ضغوطها مباشرة. هذا يغفل العملية الشاقة لقراءة ملف الصورة لإنشاء الدفق ، ثم إنشاء الحزمة المضغوطة ، ثم حذف ملف الصورة المحلي.
التطبيقات الرئيسية للتحول مدرجة أدناه:
/ *** اضغط على الصور التي تم تنزيلها حسب اليوم* throws ioException*/ خاص بولان zippic (سلسلة picpath ، syndate سلسلة ، خريطة <سلسلة ، سلسلة> addrmap) يلقي ioexception {// لأنها عبارة عن صورة تخزين متعددة الخيوط ، خريطة مؤطرة مؤطر concurrenthashmap <string ، inputStream> () ؛ // يتم تعريف عدد الصور التي تم تنزيلها بواسطة كل مؤشر ترابط هنا العدد int = 400 ؛ // تخزين عنوان الصورة الذي يحتاج إلى تنزيل القائمة <الإدخال <string ، string >> addrlist = new ArrayList <entry <string ، string >> (addrmap.entryset ()) ؛ // عدد المواضيع ، أضف واحدة لأنك تريد إنشاء مؤشر ترابط لتنزيل آخر أقل من 400 صورة int nthreads = (addrlist.size ()/count) +1 ؛ // countDownLatch CountDownLatch = New CountDownLatch (nThReads) ؛ حاول {boolean downpic = false ؛ . if (downpic) {ziputil.zipbyarray (piclist ، ملف جديد (picpath+syncate+". zip")) ؛ } إعادة صواب ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ العودة كاذبة }}هنا إنشاء تجمع الخيوط
/ *** قم بتنزيل الصورة وفقًا لعنوان url* throws interruptedException*/ private boolean downpic (String picpath ، قائمة <الإدخال <string ، string >> addrlist ، map <string ، byte [] ThreadPool = Executors.NewFixedThreadPool (nThReads) ؛ // إنشاء اثنين من العدادات countDownLatch start = new CountDownLatch (0) ؛ CountDownLatch End = New CountDownLatch (nThReads) ؛ // loop إنشاء مؤشر ترابط لـ (int i = 0 ؛ i <nthreads ؛ i ++) {list <entry <string ، string >> subaddrlist = null ؛ // حساب البيانات التي تم تنفيذها بواسطة كل مؤشر ترابط إذا ((i + 1) == nThReads) {int startIndex = (i * count) ؛ int endindex = addrlist.size () ؛ subaddrlist = addrlist.sublist (startIndex ، EndIndex) ؛ } آخر {int startIndEx = (i * count) ؛ int endindex = (i + 1) * count ؛ subaddrlist = addrlist.sublist (startIndex ، EndIndex) ؛ }. // طريقة تنفيذ المواضيع هنا هي استدعاء threadpool.execute (myhead) في تجمع مؤشرات الترابط. حاول {threadpool.execute (myhead) ؛ } catch (استثناء e) {// سجل خطأ السجل FALSE ؛ }} begin.countDown () ؛ end.await () ؛ // أغلق بركة مؤشر الترابط threadpool.shutdown () ؛ // هنا يجب أن تحلق حتى تنتهي جميع المواضيع في تجمع الخيوط قبل النزول. نظرًا لهذه الخطوة أثناء الاختبار ، قام مؤشر ترابط الطفل بتنزيل الصورة ولكنه لم يكتمل ، وقد انخفض الخيط الرئيسي ، مما أدى إلى عدم وجود صور في الحزمة المضغوطة // يمكنك أيضًا استخدام CountDownlatch لتنفيذ/*بينما (صواب) {if (threadpool.isterminind ()) استراحة؛ }}*/ return true ؛ }ما يلي هو تنفيذ مؤشر الترابط
Class picdownload يطرف RunNable {// قم بتنزيل قائمة عنوان قائمة الصور <الإدخال <string ، string >> addRlist ؛ // تحميل قائمة الصور التي تم تنزيلها بنجاح <string ، byte []> piclist ؛ الخريطة <string ، inputStream> pictureList ؛ // مسار التخزين المحلي لسلسلة الصورة picpath ؛ CountDownlatch Begin ، End ؛ Public PicDownload (String picpath ، قائمة <الإدخال <string ، string >> addrlist ، خريطة <string ، inputStream> piclist ، countDownLatch stabl ، countDownLatch End) {this.addrlist = addrlist ؛ this.piclist = piclist ؛ this.pacpath = picpath ؛ this.begin = تبدأ ؛ this.end = نهاية ؛ } Override public void run () {try {system.out.println (thread.currentThread (). getName ()+"------"+thread.currentThRead (). getId ()) ؛ التصوير المنخفض (addrlist) ؛ //system.out.println (CountDownLatch.getCount ()) ؛ begin.await () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {end.countDown () ؛ //countdownlatch.countdown () ؛ }} public boolean downpicture (list <intrad <string ، string >> addrlist) يلقي استثناء {inputStream is = null ؛ fileOutputStream fos = null ؛ url url = null ؛ اسم ملف السلسلة = فارغ ؛ سلسلة picaddr = فارغة ؛ ملف الموافقة المسبقة عن علم = فارغة ؛ حاول {for (map.entry <string ، string> addRentry: addRlist) {filename = addRentry.getKey () ؛ picaddr = addrentry.getValue () ؛ // إنشاء url url url url = url جديد (picaddr) ؛ IS = url.openstream () ؛ // سيتم كتابة الدفق الذي تم الحصول عليه بواسطة urlConnection مباشرة في صفيف البايت من خلال InputStream وسيخسر البيانات ، مما يؤدي إلى صور غير مكتملة. استخدم org.apache.commons.io.ioutils.tobytearray (urlConnection.openStream ()) لحل // byte [] bytes = ioutils.tobytearray (IS) ؛ // new byte [is.availivation ()] ؛ تتم قراءة البايتات التي تم الحصول عليها // البيانات الموجودة في الدفق في صفيف البايت. بعد القراءة في ، تم مسح البيانات الموجودة في الدفق piclist.put (filename+". JPG" ، IS) ؛ // في هذا الوقت ، نظرًا لعدم كتابة الدفق إلى الملف ، يجب عدم إغلاق الدفق ، وإلا فإن البيانات الموجودة في الدفق ستضيع //is.close () ؛ } إعادة صواب ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ العودة كاذبة } أخيرًا {// لا يمكن إغلاق الدفق/*if (null! = is) {is.close () ؛ }*/}}} واجهت مشكلة أخرى باستخدام تدفقات للضغط أعلاه. عند ضغط الملف ، java.net.socketexception: إعادة تعيين الاتصال
بعد تحليل السبب ، يجب أن يكون دفق InputStream و urlconnection في حالة الاتصال ، وتسبب إعادة تعيين مهلة URLConnection في الحصول على دفق الإدخال.
حاولت تعيين وقت المهلة في URLConnection ، لكن أثناء الاختبار ، وجدت أن سرعة الشبكة لتنزيل الصورة المستلمة قد تأثرت بشكل كبير. هذه الطريقة غير مستقرة للغاية وغير مرغوب فيها. في النهاية ، لم أتخلى عن استخدام الدفق فقط واستخدمت صفيف بايت لتمريره إلى فئة أداة الضغط ، ثم حولت صفيف البايت لدفق الضغط.
/ ***استخدم الحاوية لتخزين صفيف بايت الصورة*// Public Boolean Downpicture (قائمة <الإدخال <string ، string >> addrlist) رمي الاستثناء {inputStream is = null ؛ fileOutputStream fos = null ؛ url url = null ؛ اسم ملف السلسلة = فارغ ؛ سلسلة picaddr = فارغة ؛ ملف الموافقة المسبقة عن علم = فارغة ؛ حاول {for (map.entry <string ، string> addRentry: addRlist) {filename = addRentry.getKey () ؛ picaddr = addrentry.getValue () ؛ // إنشاء url url url url = url جديد (picaddr) ؛ // افتح الاتصال وإنشاء كائن java.net.urlconnection. هذا الكائن ليس لديه طريقة لإغلاق الاتصال. يمكن تحويله إلى HttPurlConnection من الفئة الفرعية لاستدعاء طريقة قطع الاتصال لإغلاق الاتصال. //java.net.urlconnection و java.net.httpurlConnection كلا من أساليب المهلة لإغلاق الاتصال // httpurlconnection uc = (httpurlconnection) url.openconnection () ؛ IS = UC.GetInputStream () ؛ // سيتم كتابة الدفق الذي تم الحصول عليه بواسطة urlConnection مباشرة في صفيف البايت من خلال InputStream وسيخسر البيانات ، مما يؤدي إلى صور غير مكتملة. استخدم org.apache.commons.io.ioutils.tobytearray (urlConnection.openstream ()) لحل البايت [] بايت = ioutils.tobytearray (IS) ؛ // new byte [is.avile ()] ؛ تتم قراءة البيانات التي تم الحصول عليها // في الدفق في صفيف البايت. بعد القراءة في ، تم مسح البيانات الموجودة في الدفق //is.read(bytes) ؛ piclist.put (filename+". jpg" ، bytes) ؛ is.close () ؛ } إعادة صواب ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ العودة كاذبة } أخيرًا {if (null! = is) {is.close () ؛ }}} تلخيص:
المشاكل التي واجهتها أثناء التنفيذ:
1. عند استخدام تجمع مؤشرات الترابط ، للحالة المشتركة ، على سبيل المثال ، تتم مشاركة حاوية بيانات البايت التي يتم تخزينها هنا بواسطة جميع مؤشرات الترابط ، وبالتالي فإن الحاوية المتزامنة مطلوبة ، وإلا فإنها ستؤدي إلى مشاكل في البيانات المخزنة. لذلك ، يتم استخدام concurrenthashmap <string ، byte []>.
2. هناك مشكلة في ترتيب تنفيذ الخيط الرئيسي وخيط الطفل هنا ، لأن الخيط الرئيسي يحتاج إلى انتظار جميع مؤشرات الترابط في مجموعة مؤشرات الترابط لإنهاء تنزيل الصور قبل النزول لضغط الصور. إذا كان الخيط الرئيسي لا ينتظر أن ينتهي مؤشر ترابط الطفل وتنفيذ طريقة الضغط لأسفل ، فسيؤدي ذلك إلى صور مفقودة أو بدون مضغوط. لذلك ، يمكنك استخدام CountDownlatch لتنفيذها ، أو استخدام حلقة ميتة للتحقق من threadpool.isterminated () ضمن عبارة مجموعة مؤشرات الترابط الإغلاق لمواصلة تنفيذ مؤشر الترابط الرئيسي لضغط الصورة.
3. نظرًا لأن دفق الإدخال الذي تم الحصول عليه بواسطة URLConnection يتم نقله مباشرة إلى الفئة المضغوطة للضغط ، فهناك موقف يتم فيه إعادة ضبط مهلة الاتصال ، لذا بدلاً من ذلك ، يتم تخزين الدفق الذي تم تنزيله في صفيف بايت ثم ينتقل إلى الفئة المضغوطة لضغط لتجنب المواقف غير المتوقعة عند استخدام التيار.
4. بعد استخدام urlconnection.openstream () للحصول على دفق الإدخال ، فإن الصورة التي قمت بتحويلها إلى صفيف بايت للتنزيل غير مكتملة. . يمكن حلها باستخدام org.apache.commons.io.ioutils.tobytearray (urlConnection.openstream ()). للحصول على التفاصيل ، يمكنك قراءة الرمز المصدر لعرض التطبيق.
فيما يلي تنفيذ فئة أدوات FTP:
استيراد java.io.bufferedInputStream ؛ استيراد java.io.bufferedOutputStream ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد org.apache.commons.net.ftp.ftpclient ؛ استيراد org.apache.commons.net.ftp.ftpclientConfig ؛ استيراد org.apache.commons.net.ftp.ftpconnectionClosexception ؛ استيراد org.apache.commons.net.ftp.ftpreply ؛ الفئة العامة ftputil2 {private ftpclient ftpclient = null ؛ // عنوان خادم FTP اسم مضيف السلسلة الخاصة ؛ // FTP Server Port Public Static int DefaultPort = 21 ؛ // اسم تسجيل الدخول اسم المستخدم الخاص بالسلسلة الخاصة ؛ // تسجيل الدخول إلى كلمة مرور كلمة مرور السلسلة الخاصة ؛ // الدليل البعيد للوصول إلى سلسلة private remotedir ؛ / ** * param assname * عنوان المضيف * Param Port * رقم المنفذ * param username * username * param password * password * param remotedir * دليل العمل الافتراضي * @param is_zhtimezone * ما إذا كان ذلك هو صيني ftp server * @return */// ** propconfig.loadConfig ("system.properties") ؛ string hostname = config.getConfig ("ftpaddress") ؛ منفذ السلسلة = config.getConfig ("ftpport") ؛ username string = config.getConfig ("ftpuserName") ؛ string password = config.getConfig ("ftppassword") ؛ سلسلة remotedir = config.getConfig ("remoteFilePath") ؛ منطقية is_zhtimezone = true ؛ this.hostname = اسم المضيف ؛ this.username = اسم المستخدم ؛ this.password = كلمة المرور ؛ this.remotedir = remotedir == null؟ "": Remotedir ؛ this.ftpClient = جديد ftpclient () ؛ if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()) ؛ this.ftpclient.setControlenCoding ("GBK") ؛ } // تسجيل الدخول()؛ // تبديل الدليل this.changedir (this.remotedir) ؛ this.setFiletype (ftpclient.binary_file_type) ؛ ftpclient.setDefaultPort (integer.parseint (port)) ؛ } public ftputil2 (اسم HostName ، منفذ int ، اسم مستخدم السلسلة ، كلمة مرور السلسلة ، سلسلة Remotedir ، منطقية is_zhtimezone) {this.hostName = hostName ؛ this.username = اسم المستخدم ؛ this.password = كلمة المرور ؛ DefaultPort = منفذ ؛ this.remotedir = remotedir == null؟ "": Remotedir ؛ this.ftpClient = جديد ftpclient () ؛ if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()) ؛ this.ftpclient.setControlenCoding ("GBK") ؛ } // تسجيل الدخول إلى this.login () ؛ // تبديل الدليل this.changedir (this.remotedir) ؛ this.setFiletype (ftpclient.ascii_file_type) ؛ ftpclient.setDefaultport (port) ؛ } / *** قم بتسجيل الدخول إلى خادم FTP* / تسجيل الدخول المنطقي العام () {boolean success = false ؛ حاول {ftpclient.connect (this.hostname ، defaultport) ؛ ftpclient.login (this.username ، this.password) ؛ رد الرد = ftpclient.getReplyCode () ؛ if (! ftpreply.ispositivecOption (الرد)) {ftpclient.disconnect () ؛ العودة النجاح }} catch (ftpConnectionClosedException e) {// todo catch catch e.printstacktrace () ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ } النجاح = صحيح ؛ System.out.println ("الاتصال بخادم FTP:" + this.hostName + "Success..Start Login") ؛ العودة النجاح } private ftpclientconfig config () {ftpClientConfig conf = new ftpclientConfig (ftpClientConfig.syst_unix) ؛ conf.setRecentDateFormatStR ("MM Month DD DATE HH: MM") ؛ // conf.setRecentDateFormatstr ("(Yyyyy Year)؟ MM Month DD (HH: MM)؟") ؛ العودة conf } / ** * تغيير دليل العمل * * param remotedir * * / public void changeir (سلسلة remotedir) {try {this.remotedir = remotedir ؛ ftpclient.ChangeWorkingDirectory (Remotedir) ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ } system.out.println ("تغيير دليل العمل إلى:" + Remotedir) ؛ } / ** * العودة إلى دليل المستوى السابق (دليل الوالدين) * / public void toparentDir () {try {ftpclient.changetoparentDirectory () ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ }} / ***اذكر جميع الملفات في دليل العمل الحالي* / public string [] sistallfiles () {string [] names = this.listfiles ("*") ؛ إرجاع this.sort (أسماء) ؛ } / ** * قائمة الملفات المطابقة في دليل العمل المحدد * * param dir * exp: / cim / * param file_regex * wildcard هو * * / public string [] listAllFiles (سلسلة dir ، string file_regex) {string [] names = this.listfiles (dir + file_regex) ؛ إرجاع this.sort (أسماء) ؛ } /** * قائمة ملفات مطابقة * * param file_regex * أحرف المطابقة ، أحرف WildCard هي * /public string [] listfiles (string file_regex) {try { /** * ftpfile [] remotefiles = ftpclient.listfiles (file_regex) ؛ * //system.out.println(RemoteFiles.Length) ؛ String [] name = new * string [remoteFiles.Length] ؛ if (remotefiles! = null) {for (int * i = 0 ؛ i <remotefiles.length ؛ i ++) {if (RemoteFiles [i] == null) * name [i] = "" ؛ else * if (RemoteFiles [i] .getName () == null || RemoteFiles * [i] .getName (). equals * ("." *} اسم آخر [i] = RemoteFiles [i] .getName () ؛ * system.out.println (name [i]) ؛ }} */ ftpClient.EnterLocalPassiveMode () ؛ String [] name = ftpclient.listNames (file_regex) ؛؛ if (name == null) إرجاع سلسلة جديدة [0] ؛ إرجاع this.sort (الاسم) ؛ } catch (استثناء e) {// todo catch e.printstacktrace () ؛ } إرجاع سلسلة جديدة [0] ؛ } قوائم void العامة (String Reg) {try {string [] a = ftpclient.listNames (reg) ؛ if (a! = null) {for (string b: a) {system.out.println (b) ؛ }}} catch (ioException e) {// todo catch catch e.printstacktrace () ؛ }} / ** * قم بتعيين نوع الملف المنقوف [ملف نصي أو ملف ثنائي] * * param fileType * --binary_file_type ، ascii_file_type * / public void setFileType (int filetype) {try {ftpclient.setfiletype (filetype) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}/ *** تحميل ملف** param localfilepath* -مسار الملف local + اسم الملف* param newFilename* -new file name*/ public void uploadfile (String localfilepath ، newFilename) {// upload file this.ftpclient.enterlocalpassiviveive () حاول {buffin = جديد bufferedInputStream (جديد fileInputStream (localFilePath)) ؛ ifupload boolean = ftpclient.storefile (newFilename ، Buffin) ؛ if (! ifupload) {system.out.println ("تحميل الملف فشل ...") ؛ } آخر {system.out.println ("تحميل الملف بنجاح ...") ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (buffin! = null) buffin.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}/ ** * تحميل ملف 2 * * param file * -fileinputStream file * param newFilename * -new file name */ public void newUploAdfile (fileInputStream file ، string newFilename) {// قم بتحميل الملف this.ftpclient.enterlocalpassiveMode () ؛ حاول {buffin = جديد bufferedInputStream (ملف) ؛ ifupload boolean = ftpclient.storefile (newFilename ، Buffin) ؛ if (! ifupload) {system.out.println ("فشل تحميل ملف ...") ؛ } آخر {system.out.println ("تحميل ملف بنجاح ...") ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (buffin! = null) buffin.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}/ ** * تنزيل ملف (واحد) * * param remoteFiLename * -اسم الملف على الخادم * param localfilename * -اسم الملف local */ public boolean downloadFile (String RemoteFilename ، string localfilename) {this.ftpclient.enterlocalpassiviveiveiDeive () حاول {buffout = new BufferedOutputStream (FileOutputStream جديد (localfilename)) ؛ Boolean ifdownload = ftpClient .RetRieveFile (RemoteFilename ، Buffout) ؛ if (! ifdownload) {system.out.println ("فشل تنزيل الملف ...") ؛ العودة كاذبة } آخر {system.out.println ("تنزيل الملف بنجاح ...") ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ العودة كاذبة } أخيرًا {try {if (buffout! = null) buffout.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }} إرجاع صحيح ؛ } / *** أغلق اتصال FTP* / public void close () {try {if (ftpClient! = null) {ftpclient.logout () ؛ ftpclient.disconnect () ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }} / ** * سلسلة فرز الفقاعة (من كبير إلى صغير) * / سلسلة عامة [] sort (String [] str_array) {if (str_array == null) {throw nullpointerexception ("لا يمكن أن يكون str_array لاغية!") ؛ } string tmp = "" ؛ لـ (int i = 0 ؛ i <str_array.length ؛ i ++) {for (int j = 0 ؛ j <str_array.length - i - 1 ؛ j ++) {if (str_array [j] .Compareto (str_array [j+1]) <0) {tmp = str_array [j] ؛ str_array [j] = str_array [j + 1] ؛ str_array [j + 1] = tmp ؛ }}} return str_array ؛ } الفراغ الثابت العام (سلسلة [] strs) {ftputil2 ftputil2 = new ftputil2 ("192.168.1.112" ، 20011 ، "test1" ، "test1" ، "/" ، true) ؛ ftputil2.downloadFile ("test.txt" ، "d: //test.txt") ؛ }}ما يلي هو فئة الأدوات ZIP:
استيراد java.io.file ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputStream ؛ استيراد java.util.arraylist ؛ استيراد java.util.enumeration ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ استيراد java.util.zip.zipentry ؛ استيراد java.util.zip.zipfile ؛ استيراد java.util.zip.zipoutputStream ؛ استيراد org.apache.commons.io.ioutils ؛ استيراد com.ibatis.common.logging.log ؛ استيراد com.ibatis.common.logging.logfactory ؛ الفئة العامة Ziputil {private static final log = logfactory.getLog (ziputil.class) ؛ / *** ملف مضغوط** param srcfile file [] قائمة الملفات التي تحتاج إلى ضغط* param zipfile ملفات مضغوطة*/ public static static zipfiles (قائمة <ipl> srcfile ، outputstream outputstream) {byte [] buf = new byte [1024] ؛ جرب {// إنشاء ملف zip zipoutputStream Out = new zipoutputStream (outputStream) ؛ // ضغط الملفات لـ (int i = 0 ؛ i <srcfile.size () ؛ i ++) {file file = srcfile.get (i) ؛ FileInputStream في = جديد fileInputStream (ملف) ؛ // إضافة إدخال zip إلى دفق الإخراج. out.putnextentry (new zipentry (file.getName ())) ؛ // نقل بايت من الملف إلى ملف zip int len ؛ بينما ((len = in.read (buf))> 0) { //system.out.println(len+"============================================================================================================ ================================================================================================================================================ ================================================================================================================================================ ================================================================================================================================================ e) {log.error ("ziputil zipfiles استثناء:"+e) ؛ بايت [1024] دفق الإخراج (ioException e) {log.error ("ziputil zipfiles استثناء:"+e) ؛ {try {// إنشاء ملف Zip zipoutputStream = new zipoutputstream (fileOtputStream جديد (zipfile)) ؛ FileEntry.getValue () out.closeentry () ؛ param srcfile * param zipfile * see */ public zipbyarray (map <string ، byte [] System.out.println (srcfile.Entryset (). ملف zip byte [] استثناء: "+e) ؛ system.out.println ( zipfile (zipfile) ؛ System.out.println (zipentryname) ؛ out.close () ؛ ملف (D: //1.jpg ") ؛ ziputil.zipfiles (srcfile ، zipfile) ؛ ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.