Baru -baru ini, saya membuat persyaratan: Unduh file yang menyimpan URL gambar dari direktori FTP sistem lain, kemudian baca alamat URL dalam file, unduh gambar sesuai dengan alamat dan kompres menjadi paket dalam sehari. Rata -rata, satu file alamat berisi sekitar 4.000 alamat. Dengan kata lain, setelah memindai file, Anda perlu mengunduh sekitar 4.000 gambar, dan kemudian mengompresnya. Berikut ini mencatat metode implementasi saya dan proses optimisasi. Jika Anda memiliki cara yang lebih baik, Anda dapat membagikannya.
Kerangka kerja yang digunakan: SpringMVC
Implementasi tugas waktunya: warisan org.springframework.scheduling.quartz.quartzjobbean;
Saya tidak akan berbicara tentang pembangunan lingkungan FTP. Saya telah merekamnya di blog lain yang saya gunakan layanan FTP yang dibangun oleh CentOS di mesin virtual untuk membuat akun FTP dan direktori yang sesuai, dan mengunggah file alamat gambar yang perlu diunduh sebelumnya. Format Konten File "ID Gambar || Alamat Gambar".
Metode 1. Cara termudah untuk mengimplementasikannya adalah dengan terlebih dahulu mengunduh file yang menyimpan alamat URL gambar, kemudian membaca file traversal alamat gambar, menyesuaikan metode gambar yang diunduh untuk menyimpan gambar secara lokal, dan akhirnya mengompres gambar yang diunduh. Setelah selesai, hapus gambar yang diunduh, dan hanya mempertahankan paket terkompresi.
Public PictureTransferJob memperluas Quartzjobbean {Protected Void ExecuteInternal (JobExecutionContext arg0) melempar JobExecutionException {// Konfigurasi FTP yang sebenarnya diperoleh dengan membaca file konfigurasi // Alamat FTP String hostname = "192.1688882"; // port port ftp port = 2001; /Ftp akun string username = "test1"; // kata sandi ftp kata sandi = "test1"; // direktori penyimpanan file ftp string ftpdowload = "/"; // jalur penyimpanan lokal dari jalur string file = this.getClass (). GetResource ("/"). GetPath (); // String Direktori Penyimpanan File Alamat Gambar AddRPath = Path.SubString (1, Path.indexof ("Web-Inf/Kelas"))+"picaddr"; // String direktori penyimpanan gambar yang diunduh aktual picpath = path.substring (1, path.indexof ("web-inf/class"))+"pic"; addrpath = addrpath.replace ("%20", ""); picpath = picpath.replace ("%20", ""); coba {// Buat file CreatFile (addrPath); // Buat File CreatFile (PicPath); String oldaddrpath = addrpath; String oldPicPath = picpath; // Buat koneksi ftp ftputil2 ftputil2 = ftputil2 baru (nama host, port, nama pengguna, kata sandi, ftpdowload, true); // Transfer file dalam FTP Directory String [] file = ftputil2.listallfiles (); // Basis data lokal akan memiliki catatan tabel file yang diunduh. Di sini kami akan meminta database dan nama file yang tercantum dalam FTP. Jika file yang diunduh tidak akan diunduh, dan menghindari unduhan yang berulang. // Proses perbandingan dihilangkan di bawah ini, loop array file, dan buat file secara lokal untuk (int i = 0; i <file.length; i ++) {creatfile (addrpath+file.separator+fileName); // FTPDOWLOAD adalah alamat server FTP untuk menyimpan file, Addrpath adalah alamat file penyimpanan lokal // Berikut ini adalah status pengembalian untuk menentukan apakah file diunduh berhasil Boolean DownloadInvestorFlag = ftputil2.downloadFile (ftpdowload, addrpath); // Metode untuk membaca file setelah file diunduh dengan sukses, dan alamat gambar yang akan diunduh disimpan dalam wadah Boolean EntityState = SetPicturedetail (Addrpath, Picpath, FileNamedate); }} catch (Exception e) {e.printstacktrace (); // Klik kelas bisnis yang merekam log kesalahan untuk mengirim pesan teks yang mengunduh kesalahan file}} // Mulai membaca alamat gambar di sini private boolean setPictureTail (string addrpath, string picpath, string sindate) { System.out.println ("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Int = 0; addrmap.put (Kolom [0] .Trim (), kolom [1] .Trim ()); System.out.println (tanggal baru ()); System.out.println ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- E.PrintStackTrace (); nama file = null; Urlconnection akan ditulis langsung ke dalam array byte melalui inputstream dan akan kehilangan data, menghasilkan gambar yang diunduh tidak lengkap // Data dalam streaming dibaca ke dalam array byte, dan setelah dibaca, data dalam aliran dibersihkan pic = file baru (picpath+nama file+". Jpg"); fos.flush (); void zippic (picpath, sinkronisasi, addrmap); {// jeda dalam daftar file yang perlu dikompres dan file file terkompresi ziputil.zipbystream (piclist, file baru (picpath+sindat+". zip")); if (! File.exists ()) {file.mkdirs (); Metode 2: Unduhan multi-utas, kompresi langsung aliran
Metode 1 Meskipun fungsi dasar diimplementasikan, karena ada terlalu banyak gambar yang perlu diunduh, dan menekan file gambar lokal dan menghapus gambar juga memakan waktu, jadi ada dua tempat di mana Anda dapat mengoptimalkan kecepatan. Salah satunya adalah meningkatkan efisiensi mengunduh gambar, dan yang lainnya adalah meningkatkan efisiensi kompresi.
Metode untuk meningkatkan efisiensi unduhan dapat menggunakan unduhan multi-threaded, dan metode untuk meningkatkan efisiensi kompresi dapat secara langsung mengompres aliran file tanpa menyimpan gambar secara lokal.
Metode Implementasi Multi-Threading: Pertama, kami menyimpan daftar alamat file yang perlu diunduh. Jika kami ingin menggunakan multi-threading untuk diunduh, kami harus memastikan bahwa gambar yang diunduh oleh utas yang berbeda tidak akan diulang. Karena itu, diperlukan bendera untuk membedakannya. Pada saat ini, kita dapat menggunakan penghitung indeks untuk membaginya sesuai dengan sejumlah gambar yang diunduh oleh setiap utas. Mulai dari 0, setiap 400 gambar, kita dapat menggunakan satu utas untuk diunduh setiap saat, sehingga kita dapat menentukan jumlah utas yang dibutuhkan, dan gambar yang diunduh oleh setiap utas tidak akan diulang.
Metode Implementasi File Terkompresi: Karena esensi menghasilkan file terkompresi adalah membaca aliran file yang perlu dikompresi, dan kemudian menghasilkan paket terkompresi, kita dapat menggunakan wadah untuk menyimpan data aliran gambar yang diunduh oleh semua utas alih -alih membuat file gambar yang diunduh, dan kemudian meneruskan data aliran ke kelas alat kompresi untuk secara langsung memaksanya. Ini menghilangkan proses yang membosankan dalam membaca file gambar untuk membuat aliran, kemudian menghasilkan paket terkompresi, dan kemudian menghapus file gambar lokal.
Implementasi utama dari transformasi tercantum di bawah ini:
/** * Compress the downloaded pictures by day* @throws IOException */ private boolean zipPic(String picPath,String synDate,Map<String, String> addrMap) throws IOException{ // Since it is a multi-threaded storage image stream, a thread-safe map is needed, so use ConcurrentHashMap Map<String,InputStream> pictureList=new ConcurrenthashMap <string, inputStream> (); // Jumlah gambar yang diunduh oleh setiap utas didefinisikan di sini int count = 400; // penyimpanan alamat gambar yang perlu diunduh daftar <entry <string, string >> addrlist = arraylist baru <entry <string, string >> (addrmap.entryset ()); // Jumlah utas, tambahkan satu karena Anda ingin membuat utas untuk mengunduh kurang dari 400 gambar int nthreads = (addrlist.size ()/count) +1; // Countdownlatch countDownlatch = countDownlatch baru (nThreads); coba {boolean downpic = false; // Jalankan Multithread Download Pictures Downpic = Downpic (Picpath, Addrlist, Piclist, Picturelist, Nthreads, Count); if (downpic) {ziputil.zipbyArray (piclist, file baru (picpath+sinkronisasi+". zip")); } return true; } catch (Exception e) {E.PrintStackTrace (); mengembalikan false; }}Inilah pembuatan kumpulan benang
/** * Download the picture according to the url address* @throws InterruptedException */ private boolean downPic(String picPath,List<Entry<String, String>> addrList,Map<String, byte[]> picList,Map<String, InputStream> pictureList,int nThreads,int count)throws IOException, InterruptedException{ ExecutorService threadpool = executors.newfixedThreadPool (nThreads); // Buat dua penghitung Countdownlatch Begin = New Countdownlatch (0); Countdownlatch end = countdownlatch baru (nthreads); // loop Buat utas untuk (int i = 0; i <nthreads; i ++) {Daftar <entri <string, string >> subaddrlist = null; // Hitung data yang dijalankan oleh masing -masing utas jika ((i + 1) == nthreads) {int startIndex = (i * count); int endIndex = addrlist.size (); subaddrlist = addrlist.sublist (startIndex, endIndex); } else {int startIndex = (i * count); int endIndex = (i + 1) * hitung; subaddrlist = addrlist.sublist (startIndex, endIndex); } // class thread picdownload myhead = new picdownload (picpath, subaddrlist, piclist, picturelist); // Cara untuk menjalankan utas di sini adalah dengan memanggil metode threadpool.execute (myhead) di kumpulan utas. coba {threadpool.execute (myhead); } catch (Exception e) {// Rekam kesalahan log pengembalian false; }} begin.countdown (); end.aWait (); // tutup thread thread threadpool.shutdown (); // Di sini Anda harus mengulang sampai semua utas di kumpulan utas berakhir sebelum turun. Karena langkah ini selama pengujian, utas anak mengunduh gambar tetapi belum selesai, dan utas utama telah turun, menghasilkan tidak ada gambar dalam paket terkompresi // Anda juga dapat menggunakan CountdownLatch untuk mengimplementasikan/*while (true) {if (threadpool.isterMinated ()) {System.println ("semua utas anak telah berakhir!"); merusak; }}*/ return true; }Berikut ini adalah implementasi utas
Kelas picdownload implement runnable {// unduh daftar alamat daftar gambar <entry <string, string >> addrlist; // Muat daftar gambar berhasil diunduh peta <string, byte []> piclist; Peta <String, InputStream> Picturelist; // jalur penyimpanan lokal dari string gambar picpath; Countdownlatch Begin, end; picdownload publik (string picpath, daftar <entri <string, string >> addrlist, peta <string, inputStream> piclist, countDownlatch begin, countDownlatch end) {this.addrlist = addrlist; this.piclist = piclist; this.picpath = picpath; this.begin = begin; this.end = end; } @Override public void run () {coba {System.out.println (thread.currentThread (). GetName ()+"------"+thread.currentThread (). GetId ()); Downpicture (addrlist); //System.out.println (countDownlatch.getCount ()); begin.Await (); } catch (Exception e) {E.PrintStackTrace (); } akhirnya {end.countdown (); //countdownlatch.countdown (); }} downpicture boolean publik (daftar <entry <string, string >> addrlist) melempar pengecualian {inputStream adalah = null; FileOutputStream fos = null; Url url = null; String fileName = null; String picaddr = null; File pic = null; coba {untuk (map.entry <string, string> addRentry: addrlist) {filename = addrentry.getKey (); picaddr = addrentry.getValue (); // Buat URL Objek URL = URL baru (picaddr); IS = url.openstream (); // Aliran yang diperoleh UrlConnection akan ditulis langsung ke array byte melalui InputStream dan akan kehilangan data, menghasilkan gambar yang diunduh tidak lengkap. Gunakan org.apache.commons.io.ioutils.tobytearray (urlconnection.openstream ()) untuk menyelesaikan // byte [] bytes = ioutils.tobytearray (IS); // byte baru [is.available ()]; Byte yang diperoleh // Data dalam aliran dibaca ke dalam array byte. Setelah membaca, data dalam aliran dibersihkan piclist.put (nama file+". Jpg", adalah); // Pada saat ini, karena aliran tidak ditulis ke file, aliran tidak boleh ditutup, jika tidak data dalam aliran akan hilang //is.close (); } return true; } catch (Exception e) {E.PrintStackTrace (); mengembalikan false; } akhirnya {// aliran tidak dapat ditutup/*if (null! = is) {is.close (); }*/}}} Saya mengalami masalah lain menggunakan aliran untuk kompresi di atas. Saat mengompres file, java.net.socketexception: reset koneksi
Setelah menganalisis alasannya, itu harus menjadi bahwa stream inputstream dan urlconnection berada dalam keadaan koneksi, dan pengaturan waktu batas waktu URLConnection menyebabkan aliran input gagal mendapatkannya.
Saya mencoba mengatur waktu batas waktu urlconnection, tetapi selama pengujian, saya menemukan bahwa kecepatan jaringan unduhan gambar yang diterima sangat terpengaruh. Metode ini sangat tidak stabil dan tidak diinginkan. Pada akhirnya, saya hanya menyerah menggunakan aliran dan menggunakan array byte untuk meneruskannya ke kelas alat kompresi, dan kemudian mengonversi array byte menjadi stream kompresi.
/ ***Gunakan wadah untuk menyimpan array byte gambar yang diunduh*/ downpicture boolean publik (daftar <entri <string, string >> addrlist) melempar pengecualian {inputStream adalah = null; FileOutputStream fos = null; Url url = null; String fileName = null; String picaddr = null; File pic = null; coba {untuk (map.entry <string, string> addRentry: addrlist) {filename = addrentry.getKey (); picaddr = addrentry.getValue (); // Buat URL Objek URL = URL baru (picaddr); // Buka koneksi dan buat objek java.net.urlconnection. Objek ini tidak memiliki metode untuk menutup koneksi. Ini dapat dikonversi ke httpurlConnection subclass untuk memanggil metode pemutusan untuk menutup koneksi. //java.net.urlconnection dan java.net.httpurlconnection keduanya menetapkan metode waktu tunggu untuk menutup koneksi // httpurlconnection uc = (httpurlconnection) url.openconnection (); is = uc.getInputStream (); // Aliran yang diperoleh UrlConnection akan ditulis langsung ke array byte melalui InputStream dan akan kehilangan data, menghasilkan gambar yang diunduh tidak lengkap. Gunakan org.apache.commons.io.ioutils.tobytearray (urlconnection.openstream ()) untuk menyelesaikan byte [] bytes = ioutils.tobytearray (IS); // byte baru [is.available ()]; Data byte // yang diperoleh dalam aliran dibaca ke dalam array byte. Setelah membaca, data di aliran dibersihkan //is.read(bytes); piclist.put (nama file+". jpg", bytes); is.close (); } return true; } catch (Exception e) {E.PrintStackTrace (); mengembalikan false; } akhirnya {if (null! = is) {is.close (); }}} Meringkaskan:
Masalah yang dihadapi selama implementasi:
1. Saat menggunakan kumpulan utas, untuk keadaan bersama, misalnya, wadah data byte gambar yang disimpan di sini dibagikan oleh semua utas, sehingga wadah yang disinkronkan diperlukan, jika tidak ia akan menyebabkan masalah dengan data yang disimpan. Oleh karena itu, concurrenthashmap <string, byte []> digunakan.
2. Ada masalah dengan urutan eksekusi utas utama dan utas anak di sini, karena utas utama perlu menunggu semua utas di kumpulan utas untuk menyelesaikan mengunduh gambar sebelum turun untuk mengompres gambar. Jika utas utama tidak menunggu utas anak berakhir dan menjalankan metode kompresi ke bawah, itu akan menyebabkan hilang atau tidak ada gambar terkompresi. Oleh karena itu, Anda dapat menggunakan CountdownLatch untuk mengimplementasikannya, atau menggunakan loop dead untuk memeriksa threadpool.isterminated () di bawah pernyataan Pool Thread Penutupan untuk terus mengeksekusi utas utama untuk mengompres gambar.
3. Karena aliran input yang diperoleh URLConnection secara langsung ditransmisikan ke kelas terkompresi untuk kompresi, ada situasi di mana batas waktu koneksi disesuaikan, jadi sebaliknya, aliran yang diunduh disimpan dalam array byte dan kemudian diteruskan ke kelas terkompresi untuk menghindari situasi yang tidak terduga ketika menggunakan aliran.
4. Setelah menggunakan urlconnection.openstream () untuk mendapatkan aliran input, gambar yang Anda konversi ke array byte untuk diunduh tidak lengkap. . Ini dapat diselesaikan dengan menggunakan org.apache.commons.io.ioutils.tobytearray (urlconnection.openstream ()). Untuk detailnya, Anda dapat membaca kode sumber untuk melihat implementasi.
Berikut ini adalah implementasi kelas alat FTP:
impor java.io.bufferedInputStream; impor java.io.bufferedoutputStream; impor java.io.fileInputStream; impor java.io.fileoutputStream; impor java.io.ioException; impor org.apache.commons.net.ftp.ftpclient; impor org.apache.commons.net.ftp.ftpclientConfig; impor org.apache.commons.net.ftp.ftpConnectionClosedException; impor org.apache.commons.net.ftp.ftpreply; kelas publik ftputil2 {private ftpClient ftpClient = null; // Alamat Server FTP Private String HostName; // FTP Server Default Port Public Static Int Defaultport = 21; // nama login nama pengguna string pribadi; // Masuk Kata Sandi Private String Kata Sandi; // direktori jarak jauh untuk mengakses Private String Remotedir; /** * @param hostName * Host address* @param port * Port number* @param userName * Username* @param password * Password * @param remoteDir * Default working directory * @param is_zhTimeZone * Whether it is Chinese FTP Server side* @return * @return */ /** * New method*/ public FtpUtil2() { PropConfig config = Propconfig.LoadConfig ("System.Properties"); String hostName = config.getConfig ("ftpaddress"); String port = config.getConfig ("ftpport"); String username = config.getConfig ("ftpuserName"); String password = config.getConfig ("ftppassword"); String remotedir = config.getConfig ("remoteFilePath"); boolean is_zhtimezone = true; this.hostname = hostName; this.username = nama pengguna; this.password = kata sandi; this.remotedir = remotedir == null? "": remotedir; this.ftpClient = ftpClient baru (); if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()); this.ftpclient.setControlencoding ("GBK"); } // login (); // ganti direktori this.changedir (this.remotedir); this.setFileType (ftpclient.binary_file_type); ftpclient.setDefaultport (integer.parseint (port)); } public ftputil2 (string hostName, int port, string nama pengguna, kata sandi string, string remotedir, boolean is_zhtimezone) {this.hostname = hostname; this.username = nama pengguna; this.password = kata sandi; defaultport = port; this.remotedir = remotedir == null? "": remotedir; this.ftpClient = ftpClient baru (); if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()); this.ftpclient.setControlencoding ("GBK"); } // Masuk ke this.login (); // ganti direktori this.changedir (this.remotedir); this.setFileType (ftpclient.ascii_file_type); ftpclient.setDefaultport (port); } / *** Masuk ke server ftp* / login boolean publik () {boolean sukses = false; coba {ftpclient.connect (this.hostname, defaultport); ftpclient.login (this.username, this.password); int balasan; Balas = ftpClient.getReplyCode (); if (! ftpreply.ispositiveCompletion (balasan)) {ftpclient.disconnect (); Sukses kembali; }} catch (ftpConnectionClosedException e) {// TODO AUTO-ENTOO Catch Block E.PrintStackTrace (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); } sukses = true; System.out.println ("Connect to FTP Server:" + this.hostname + "Success..start login"); Sukses kembali; } private static ftpClientConfig config () {ftpClientConfig conf = new ftpClientConfig (ftpClientConfig.syst_unix); conf.setrecentDateFormatStr ("mm bulan dd tanggal hh: mm"); // conf.setrecentDateFormatStr ("(yyyyy tahun)? mm bulan tanggal dd (hh: mm)?"); return conf; } / ** * Ubah direktori kerja * * @param remotedir * * / public void gantiRir (string remoteDir) {coba {this.remotedir = remotedir; ftpClient.ChangeworkingDirectory (Remotedir); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); } System.out.println ("Ubah direktori kerja menjadi:" + remoteDir); } / ** * kembali ke direktori level sebelumnya (direktori induk) * / public void toparentdir () {coba {ftpclient.changetoparentdirectory (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); }} / ***Sebutkan semua file dalam direktori kerja saat ini* / public string [] listAllFiles () {string [] name = this.listFiles ("*"); return this.sort (nama); } / ** * Daftar file yang cocok di direktori kerja yang ditentukan * * @param dir * exp: / cim / * @param file_regex * Wildcard adalah * * / public string [] listAllFiles (string dir, string file_regex) {string [] name = this.listFiles (dir + file_regex); return this.sort (nama); } /** * Daftar file yang cocok * * @param file_regex * karakter cocok, karakter wildcard adalah * * /public string [] listFiles (string file_regex) {coba { /** * ftpfile [] remoteFiles = ftpClient.listFile (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] = ""; lain * if (remoteFiles [i] .getName () == null || remoteFiles * [i] .getName (). Equals * (".") || remoteFiles [i] .getName (). Equals ("..")) {name [i] = ""; *} lain nama [i] = remoteFiles [i] .getName (); * System.out.println (nama [i]); }} */ ftpclient.enterLocalPassiveMode (); String [] name = ftpclient.listNames (file_regex) ;; if (name == null) mengembalikan string baru [0]; return this.sort (name); } catch (Exception e) {// TODO Auto-Entoerated Catch Block E.PrintStackTrace (); } mengembalikan string baru [0]; } daftar public void (string reg) {coba {string [] a = ftpclient.listNames (reg); if (a! = null) {for (string b: a) {System.out.println (b); }}} catch (ioException e) {// todo auto-generated catch block e.printstacktrace (); }} / ** * Atur jenis file yang ditransfer [file teks atau file biner] * * @param filetype * - -Binary_file_type, ASCII_FILE_TYPE * / public void setFileType (int filetype) {coba {ftpclient.setFiletype (filetype); } catch (ioException e) {e.printstacktrace (); }}/ *** Unggah file** @param localfilePath* -jalur file local + nama file* @param newfileName* --NEW nama file*/ public void unggahanfile (string localfilePath, string newfileName) {// unggah file ini. coba {buffin = baru bufferedInputStream (fileInputStream baru (localfilePath)); boolean ifupload = ftpclient.storefile (newFileName, buffin); if (! ifupload) {System.out.println ("Unggah file gagal ..."); } else {System.out.println ("Unggah file berhasil ..."); }} catch (Exception e) {e.printstacktrace (); } akhirnya {coba {if (buffin! = null) buffin.close (); } catch (Exception e) {E.PrintStackTrace (); } } } /** * Upload file 2 * * @param file * --FileInputStream file* @param newFileName * --New file name*/ public void newUploadFile(FileInputStream file, String newFileName) { // Upload the file this.ftpClient.enterLocalPassiveMode();// Passive mode connection BufferedInputStream buffIn = null; coba {buffin = new bufferedInputStream (file); boolean ifupload = ftpclient.storefile (newFileName, buffin); if (! ifupload) {System.out.println ("Unggah file gagal ..."); } else {System.out.println ("Berhasil mengunggah file ..."); }} catch (Exception e) {e.printstacktrace (); } akhirnya {coba {if (buffin! = null) buffin.close (); } catch (Exception e) {E.PrintStackTrace (); }}}/ ** * Unduh coba {buffout = baru bufferedOutputStream (FileOutputStream baru (localFileName)); boolean ifdownload = ftpClient .retrieveFile (remotefileName, buffout); if (! ifdownload) {System.out.println ("Unduh File Gagal ..."); mengembalikan false; } else {System.out.println ("Unduh file berhasil ..."); }} catch (Exception e) {e.printstacktrace (); mengembalikan false; } akhirnya {coba {if (buffout! = null) buffout.close (); } catch (Exception e) {E.PrintStackTrace (); }} return true; } / *** Tutup koneksi ftp* / public void close () {coba {if (ftpClient! = Null) {ftpClient.logout (); ftpclient.disconnect (); }} catch (Exception e) {e.printstacktrace (); }} / ** * Bubble sort string (dari besar ke kecil) * / public string [] sort (string [] str_array) {if (str_array == null) {lempar nullpointerException baru ("str_array tidak bisa menjadi nol!"); } String tmp = ""; untuk (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; } public static void main (string [] strs) {ftputil2 ftputil2 = ftputil2 baru ("192.168.1.112", 20011, "test1", "test1", "/", true); Ftputil2.downloadFile ("test.txt", "d: //test.txt"); }}Berikut ini adalah kelas alat zip:
impor java.io.file; impor java.io.fileInputStream; impor java.io.fileoutputStream; impor java.io.ioException; impor java.io.inputstream; impor java.io.outputStream; impor java.util.arraylist; impor java.util.enumeration; impor java.util.list; impor java.util.map; impor java.util.zip.zipentry; impor java.util.zip.zipfile; impor java.util.zip.zipoutputStream; impor org.apache.commons.io.ioutils; impor com.ibatis.common.logging.log; impor com.ibatis.common.logging.logfactory; kelas publik ziputil {log private static log akhir = logfactory.getLog (ziputil.class); / *** File terkompresi** @param srcfile file [] Daftar file yang perlu dikompresi* @param zipfile file terkompresi file*/ public static outputStream zipfiles (Daftar <file> srcfile, outputStream outputStream) {byte [] buf = new byte [1024]; Coba {// Buat file zipoutputStream out = new zipoutputStream (outputStream); // kompres file untuk (int i = 0; i <srcfile.size (); i ++) {file file = srcfile.get (i); FileInputStream di = FileInputStream baru (file); // Tambahkan entri zip ke aliran output. out.putNextEntry (new zipEntry (file.getName ())); // Transfer byte dari file ke file zip int len; while ((len = in.read (buf))> 0) { //System.out.println(len+"===================================================================================================================================== ============================================================================================================================================== ============================================================================================================================================== ============================================================================================================================================== {LOG.Error ("Ziputil Zipfile Exception:"+e);} return outputStream; byte [1024]; Output Stream. out.close ();} Catch (ioException e) {LOG.Error ("Ziputil Zipfile Exception:"+E); ZipByStream (peta <String, InputStream> SrcFile, File ZipFile) {coba {// Buat file Zip ZipOutputStream out = new ZipOutputStream (fileOutputStream (srcfile); FileEntry: srcfile.entryset ()) {inputStream in = fileEntry.getValue (); bytes = ioutils.tobyteArray (IN); / ** * File terkompresi * Srcfile: Kunci: Nama File, Nilai: Byte Array yang sesuai dengan file * @param srcfile * @param zipfile * @see * / public static void zipbyArray (peta, byte []> srcfile, file zipfile) {byte = byte = byte [] byte [102 ZipoutputStream out = zipoutputStream baru (fileoutputStream baru (zipfile)); Entri ke Output. out.close (); Unzipfile (File Zipfile, String Descdir) {coba {// Buka file zip zipfile zf = zipfile baru (zipfile); entri.getname (); Out.write (Buf1, 0, Len); srcfile = new ArrayList <file> (); File zipfile = file baru ("d: //pic.zip"); Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.