Vor kurzem erfordern ich eine Anforderung: Laden Sie die Datei zum Speichern der Bild -URL aus dem FTP -Verzeichnis anderer Systeme herunter, lesen Sie dann die URL -Adresse in der Datei, laden Sie das Bild gemäß der Adresse und komprimieren Sie es in einem Tag in ein Paket. Im Durchschnitt enthält eine Adressdatei etwa 4.000 Adressen. Das heißt, nach dem Scannen einer Datei müssen Sie etwa 4.000 Bilder herunterladen und dann komprimieren. Nach den folgenden Aufzeichnungen meiner Implementierungsmethode und meinem Optimierungsprozess. Wenn Sie bessere Möglichkeiten haben, können Sie es teilen.
Rahmen verwendet: SpringMVC
Zeitgesteuerte Task -Implementierung: inerit org.springframework.Scheduling.quartz.quartzjobbean;
Ich werde nicht über die FTP -Umgebungskonstruktion sprechen. Ich habe es in anderen Blogs aufgezeichnet, die ich den von CentOS im virtuellen Computer erstellten FTP -Dienst verwende, um ein FTP -Konto und ein entsprechendes Verzeichnis zu erstellen, und die Bildadressdatei hochladen, die im Voraus heruntergeladen werden muss. Dateiinhaltsformat "Bild -ID || Bildadresse".
Methode 1. Die einfachste Möglichkeit, es zu implementieren, besteht darin, zuerst die Datei herunterzuladen, in der die URL -Adresse des Bildes gespeichert ist, und dann die Datei durchqueren, die Bildadresse durchquert, die heruntergeladene Bildmethode so anpassen, dass sie das Bild lokal speichern, und schließlich das heruntergeladene Bild komprimieren. Löschen Sie nach Abschluss das heruntergeladene Bild und behalten Sie nur das komprimierte Paket bei.
öffentliche Klasse picturetransferjob erweitert Quartzjobbean {Protected void executeInternal (JobExecutionContext arg0) löst JobExecutionException aus {// Die tatsächliche FTP -Konfiguration wird durch Lesen der Konfigurationsdatei // FTP -Adress -String -Hostname = "192.168.1.112 erhalten; // FTP Port int port = 2001; /FTP Account String username = "test1"; // FTP Kennwort String password = "test1"; // FTP -Dateispeicherverzeichnis String ftpDowload = "/"; // Der lokale Speicherpfad der Datei string path = this.getClass (). GetResource ("/"). GetPath (); // die Bildadressendatei-Speicherverzeichnis String addrpath = path.substring (1, path.indexof ("web-inf/clases"))+"picaddr"; // Das tatsächliche heruntergeladene Bildspeicherverzeichnis String picpath = path.substring (1, path.indexof ("web-inf/classes"))+"pic"; adDrpath = addrad.replace ("%20", ""); picpath = picpath.replace ("%20", ""); Versuchen Sie {// Erstellen Sie die Datei -Create -Datei (Addrpath); // Erstellen Sie die Datei -Create -Datei (Picpath); String OldadDRPath = AddrPath; String Oldpicad = Picpath; // Erstellen Sie die FTP -Verbindung ftputil2 ftputil2 = new ftputil2 (Hostname, Port, Benutzername, Kennwort, ftpDowload, true); // Die Datei in der FTP -Verzeichnis string [] files = ftputil2.ListallFiles () übertragen; // Die lokale Datenbank hat einen Tabellenaufzeichnung der heruntergeladenen Dateien. Hier werden wir die Datenbank und die in FTP aufgeführten Dateinamen abfragen. Wenn die heruntergeladenen Dateien nicht heruntergeladen werden und wiederholte Downloads vermeiden. // Der Vergleichsprozess ist unten weggelassen, das Dateien -Array und erstellen Sie die Datei lokal für (int i = 0; i <files.length; i ++) {CreateFile (addrpath+file.separator+Dateiname); // FTPDOWLOAD ist die Adresse des FTP -Servers zum Speichern der Datei. AddrPath ist die Adresse der lokalen Speicherdatei // Hier ist ein Rückgabestatus, um festzustellen, ob die Datei erfolgreich heruntergeladen wird. // Eine Methode zum erfolgreichen Lesen der Datei erfolgreich heruntergeladen, und die zu heruntergeladene Bildadresse wird im Container boolean entityState = setpicturedEtail (ADDRPATH, PICPATH, FileNamedate) gespeichert. }} catch (Ausnahme e) {e.printstacktrace (); // Klicken Sie auf die Business -Klasse, in der das Fehlerprotokoll aufgezeichnet wird, um Textnachrichten zu senden, die Dateifehler herunterladen}} // Lesen Sie die Bildadresse hier private boolean setpicturedetail (String -Addrpath, String Picpath, String -Syndate) { System.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- int count = 0; addrmap.put (Spalte [0] .Trim (), Spalte [1] .Trim ()); System.out.println (neues Datum ()); System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------— e.PrintstackTrace (); picaddr = null; Byte -Array durch InputStream und wird zu unvollständigen heruntergeladenen Bildern führen. Array, und nach dem Lesen wird die Daten im Stream geklärt. IS.CLOSE (); Zippic (Picpath, Syncdat, addrmap); {// Pause in der Liste der Dateien, die komprimiert werden müssen, und der komprimierte Dateiname ziputil.zipbystream (Piclist, neue Datei (Picpat+Syndate+". Zip"); if (! file.exists ()) {file.mkdirs (); Methode 2: Multi-Thread-Download, direkte Komprimierung von Streams
Methode 1 Obwohl die grundlegenden Funktionen implementiert sind, da zu viele Bilder heruntergeladen werden müssen, ist es zeitaufwändig, lokale Bilddateien und Löschen zu komprimieren. Es gibt also zwei Orte, an denen Sie die Geschwindigkeit optimieren können. Einer besteht darin, die Effizienz des Herunterladens von Bildern zu verbessern, und das andere ist die Verbesserung der Effizienz der Komprimierung.
Die Methode zur Verbesserung des Download-Effizienz kann mit mehreren Downloads mit Multi-Thread-Downloads und die Methode zur Verbesserung der Komprimierungseffizienz den Dateistrom direkt komprimieren, ohne das Bild lokal zu speichern.
Multi-Threading-Implementierungsmethode: Erstens speichern wir die Adressliste der Dateien, die heruntergeladen werden müssen. Wenn wir Multi-Threading zum Herunterladen verwenden möchten, müssen wir sicherstellen, dass die von verschiedenen Threads heruntergeladenen Bilder nicht wiederholt werden. Daher ist eine Flagge erforderlich, um sie zu unterscheiden. Zu diesem Zeitpunkt können wir einen Indexzähler verwenden, um sie nach einer bestimmten Anzahl von Bildern zu teilen, die von jedem Thread heruntergeladen wurden. Ab 0, alle 400 Bilder können wir jedes Mal einen Thread herunterladen, damit wir die Anzahl der benötigten Threads bestimmen, und die von jedem Thread heruntergeladenen Bilder werden nicht wiederholt.
Implementierungsmethode für komprimierte Dateien: Da die Essenz des Generierens komprimierter Dateien darin besteht, den Dateistrom zu lesen, der komprimiert werden muss, und dann ein komprimiertes Paket generieren, können wir den Container verwenden, um die von allen Threads heruntergeladenen Bildstromdaten zu speichern, anstatt die heruntergeladene Bilddatei zu erstellen, und die Stream -Daten an den Kompressions -Werkzeugklasse übergeben, um sie direkt zu komprimieren. Dies lässt den mühsamen Prozess des Lesens der Bilddatei aus, um den Stream zu erstellen und dann das komprimierte Paket zu generieren und dann die lokale Bilddatei zu löschen.
Die Hauptimplementierungen der Transformation sind unten aufgeführt:
/ *** Komprimieren Sie die heruntergeladenen Bilder nach Tag* @throws ioException*/ private boolean Zippic (String Picpath, String-Syndate, Karte <String, String> addrmap) löst IoException aus {//, da es sich ConcurrenthashMap <String, InputStream> (); // Die Anzahl der von jedem Thread heruntergeladenen Bilder ist hier int count = 400; // Die Bildadresse speichern, die heruntergeladen werden muss. // Die Anzahl der Threads fügen Sie einen hinzu, da Sie einen Thread erstellen möchten, um die letzten weniger als 400 Bilder int nthreads = (addrlist.size ()/count) +1 herunterzuladen; // Countdownlatch Countdownlatch = new Countdownlatch (NThreads); Versuchen Sie {boolean downpic = false; // multithread download bilder downpic = downpic (picpath, addrlist, piclist, picturelist, nthreads, count); if (downpic) {ziputil.zipbyarray (piclist, neue Datei (picpath+syncate+". Zip")); } Return true; } catch (Ausnahme e) {e.printstacktrace (); false zurückgeben; }}Hier ist die Erstellung eines Fadenpools
/ *** Laden Sie das Bild gemäß der URL -Adresse herunter* @Throws InterruptedException*/ private boolean downpic (String picpath, Liste <Eintrag <String, String >> addrlist, map <String, Byte []> Piclist, Karte <String, InputStream> Picturelist, Int threads, Int Count) Throws IOException, InterruptedExceptedException {executorsievice {executorsievice {executorse threadpool = Executors.NewFixedThreadpool (nThreads); // zwei Zähler erstellen Countdownlatch begin = new Countdownlatch (0); Countdownlatch End = new Countdownlatch (Nthreads); // Loop Thread für (int i = 0; i <nThreads; i ++) {list <Eintrag <String, String >> subaddrlist = null; // Berechnen Sie die von jedem Thread ausgeführten Daten, wenn ((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) * zählen; subaddrlist = addrlist.sublist (startIndex, EndIndex); } // Thread Class picdownload myhead = new picdownload (picpath, subaddrlist, piclist, picturelist); // Die Art und Weise, wie Threads hier ausgeführt werden, besteht darin, die Methode von ThreadPool.execute (myhead) im Thread -Pool aufzurufen. Versuchen Sie {threadpool.execute (myhead); } catch (Ausnahme e) {// Fehlerprotokoll zurückgeben. }} begin.countdown (); end.aait (); // Schließen Sie den Threadpool threadpool.shutdown (); // Hier müssen Sie schaufeln, bis alle Threads im Thread -Pool endet haben, bevor Sie nach unten gehen. Aufgrund dieses Schritts während des Tests hat der untergeordnete Thread das Bild heruntergeladen, aber nicht abgeschlossen, und der Haupt -Thread ist nach unten gegangen, was zu keinen Bildern im komprimierten Paket // führt, können Sie auch Countdownlatch verwenden, um/*zu implementieren (true) {if (threadpool.isterMined ()) {System.out.println ("Alle untergeordneten Threads haben endete!"); brechen; }}*/ return true; }Das Folgende ist die Thread -Implementierung
class picdownload implements runnable {// Die Adressliste der Bilderliste <Eintrag <String, String >> adrlist herunterladen; // Laden Sie die Liste der Bilder erfolgreich herunter. Map <String, Byte []> Piclist; Karte <String, InputStream> Picturelist; // der lokale Speicherpfad des Bildzeichenfolge Picpath; Countdownlatch beginne, Ende; public picdownload (String Picpath, Liste <Eintrag <String, String >> addrlist, map <string, inputStream> piclist, Countdownlatch -Start, Countdownlatch -Ende) {this.addrlist = addrlist; this.piclist = piclist; this.picad = picpath; this.begin = begin; this.end = Ende; } @Override public void run () {try {system.out.println (Thread.currentThread (). GetName ()+"------"+Thread.currentThread (). GetId ()); Downpicture (AddRList); //System.out.println (Countdownlatch.getCount ()); begin.Await (); } catch (Ausnahme e) {e.printstacktrace (); } endlich {end.Countdown (); //countdownlatch.countdown (); }} public boolean downpicture (list <Eintrag <String, String >> adrlist) löst Ausnahme aus {inputStream is = null; FileOutputStream fos = null; URL URL = NULL; String Dateiname = null; String picaddr = null; Datei pic = null; try {for (map.entry <string, string> addrentry: addrlist) {fileName = addrentry.getKey (); picaddr = addrEentry.getValue (); // Erstellen Sie die URL -Objekt -URL = New URL (picaddr); ist = url.openstream (); // Der durch UrlConnection erhaltene Stream wird direkt über InputStream in das Byte -Array geschrieben und verliert Daten, was zu unvollständigen heruntergeladenen Bildern führt. Verwenden Sie org.apache.commons.io.ioutils.tobytearray (urlConnection.openstream ()), um // byte [] bytes = ioutils.tobytearray (IS) zu lösen; // neues Byte [IS.Available ()]; Die erhaltenen Bytes // Die Daten im Stream werden in das Byte -Array gelesen. Nach dem Lesen werden die Daten im Stream die PICLILT.PUT (Dateiname+". JPG", IS); // Da der Stream nicht in die Datei geschrieben ist, darf der Stream nicht geschlossen werden, andernfalls gehen die Daten im Stream verloren //is.close (). } Return true; } catch (Ausnahme e) {e.printstacktrace (); false zurückgeben; } endlich {// Der Stream kann nicht geschlossen werden/*if (null! = is) {is.close (); }*/}}} Ich habe ein weiteres Problem mit Streams zur oben genannten Komprimierung gestoßen. Beim Komprimieren der Datei java.net.socketException: Verbindungsrücksetzen
Nach der Analyse des Grundes sollte der Stream InputStream und die UrlConnection im Verbindungszustand liegen und das Timeout -Reset der UrlConnection führt dazu, dass der Eingabestream nicht erreicht wird.
Ich habe versucht, die Zeitüberschreitungszeit der UrlConnection festzulegen, aber während des Tests stellte ich fest, dass die Netzwerkgeschwindigkeit des empfangenen Bilddownloads stark beeinflusst wurde. Diese Methode ist sehr instabil und unerwünscht. Am Ende gab ich nur mit dem Stream auf und benutzte ein Byte -Array, um es an die Komprimierungswerkzeugklasse weiterzugeben, und konvertierte dann das Byte -Array in die Stream -Komprimierung.
/ ***Verwenden Sie den Container, um heruntergeladenes Bild Byte -Array*/ public boolean herunterzuordnen (Liste <Eintrag <String, String >> addrlist) Ausnahme {InputStream is = null; FileOutputStream fos = null; URL URL = NULL; String Dateiname = null; String picaddr = null; Datei pic = null; try {for (map.entry <string, string> addrentry: addrlist) {fileName = addrentry.getKey (); picaddr = addrEentry.getValue (); // Erstellen Sie die URL -Objekt -URL = New URL (picaddr); // Öffnen Sie die Verbindung und erstellen Sie das Objekt java.net.urlConnection. Dieses Objekt hat keine Methode, um die Verbindung zu schließen. Es kann in seine Unterklasse httpurlConnection konvertiert werden, um die Trennungsmethode aufzurufen, um die Verbindung zu schließen. //java.net.urlConnection und java.net.httpurlConnection Beide Timeout -Methoden einstellen, um die Verbindung zu schließen // httpurlConnection uc = (httpurlConnection) url.openconnection (); is = uc.getInputStream (); // Der durch UrlConnection erhaltene Stream wird direkt über InputStream in das Byte -Array geschrieben und verliert Daten, was zu unvollständigen heruntergeladenen Bildern führt. Verwenden Sie org.apache.commons.io.ioutils.tobytearray (urlConnection.openstream ()), um Byte [] bytes = ioutils.tobytearray (IS); // New Byte [IS.Arlable ()] zu lösen; Die erhaltenen Bytes // Daten im Stream werden in das Byte -Array gelesen. Nach dem Lesen werden die Daten im Stream gelöscht //is.read(Bytes); piclist.put (Dateiname+". JPG", Bytes); IS.CLOSE (); } Return true; } catch (Ausnahme e) {e.printstacktrace (); false zurückgeben; } endlich {if (null! = is) {is.close (); }}} Zusammenfassen:
Probleme, die während der Implementierung auftreten:
1. Bei der Verwendung von Thread -Pool wird beispielsweise der hier gespeicherte Bild -Byte -Datencontainer für den gemeinsam genutzten Status von allen Threads gemeinsam genutzt, sodass ein synchronisierter Container erforderlich ist, andernfalls verursacht er Probleme mit den gespeicherten Daten. Daher wird ConcurrenthasMap <String, Byte []> verwendet.
2. Es gibt ein Problem mit der Ausführungsreihenfolge des Haupt -Threads und des untergeordneten Threads hier, da der Haupt -Thread auf alle Threads im Thread -Pool warten muss, um Bilder herunterzuladen, bevor sie zu Komprimierungsbildern gehen. Wenn der Hauptfaden nicht darauf wartet, dass der untergeordnete Thread endet und die Komprimierungsmethode nach unten ausführt, führt er zu fehlenden oder nicht komprimierten Bildern. Daher können Sie Countdownlatch verwenden, um es zu implementieren oder eine tote Schleife zu überprüfen, um Threadpools zu überprüfen. Veristerien () unter der Anweisung "Schließbereitungsbecken", um den Haupt -Thread weiter auszuführen, um das Bild zu komprimieren.
3. Da der durch UrlConnection erhaltene Eingangsstrom direkt zur Komprimierung der komprimierten Klasse übertragen wird, gibt es eine Situation, in der die Verbindungszeitlimitresorte zurückgesetzt wird. Stattdessen wird der heruntergeladene Stream in einem Byte -Array gespeichert und dann an die komprimierte Klasse übergeben, um zu komprimieren, um unerwartete Situationen bei der Verwendung des Stroms zu vermeiden.
4. Nachdem Sie urlConnection.openstream () verwendet haben, um den Eingabestream zu erhalten, ist das Bild, das Sie zum Download in ein Byte -Array konvertiert haben, unvollständig. . Es kann mit org.apache.commons.io.ioutils.tobytearray (urlConnection.openstream ()) gelöst werden. Details können Sie den Quellcode lesen, um die Implementierung anzuzeigen.
Das Folgende ist die Implementierung der FTP -Toolklasse:
import Java.io.BufferedInputStream; importieren java.io.bufferedOutputStream; import Java.io.FileInputStream; importieren java.io.fileoutputStream; importieren java.io.ioException; import org.apache.commons.net.ftp.ftpclient; import org.apache.commons.net.ftp.ftpclientconfig; import org.apache.commons.net.ftp.ftpConnectionCosedException; import org.apache.commons.net.ftp.ftpreply; public class ftputil2 {private ftpclient ftpclient = null; // FTP Server -Adresse privater String -Hostname; // FTP Server Standard Port Public static int defaultPort = 21; // Login -Name privater String -Benutzername; // Passwort anmelden private Zeichenfolge Passwort; // Remote -Verzeichnis zum Zugriff auf private Zeichenfolge ausgestattet; / ** * @param hostname * Host -Adresse * @param port * Portnummer * @param userername * userername * @param password * password * @param remotedir * Standard funktionierender Verzeichnis * @param is_zhtimezone * ob es sich Propconfig.loadConfig ("System.Properties"); String hostname = config.getConfig ("ftpaddress"); String port = config.getConfig ("ftpport"); String username = config.getConfig ("ftpusername"); String password = config.getConfig ("ftppasword"); String remotedir = config.getConfig ("remoteFilepath"); boolean is_zhtimezone = true; this.hostname = hostname; this.username = userername; this.Password = Passwort; this.Remotedir = remotedir == null? "": REMOTTIR; this.ftpclient = new ftpclient (); if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()); this.ftpclient.setControlencoding ("GBK"); } // login (); // das Verzeichnis this.changedir (this.remotedir) wechseln; this.setFiletype (ftpclient.berary_file_type); ftpclient.setDefaultPort (Integer.ParseInt (Port)); } public fTputil2 (String -Hostname, int Port, String -Benutzername, String -Passwort, String Remotedir, boolean is_zhtimezone) {this.hostname = hostname; this.username = userername; this.Password = Passwort; defaultPort = port; this.Remotedir = remotedir == null? "": REMOTTIR; this.ftpclient = new ftpclient (); if (is_zhtimezone) {this.ftpclient.configure (ftputil2.config ()); this.ftpclient.setControlencoding ("GBK"); } // melden Sie sich bei this.login () an; // das Verzeichnis this.changedir (this.remotedir) wechseln; this.setFiletype (ftpclient.ascii_file_type); ftpclient.setDefaultPort (Port); } / *** Melden Sie sich beim FTP -Server an* / public boolean login () {boolean success = false; try {ftpclient.connect (this.hostname, defaultPort); ftpclient.login (this.username, this.Password); int Antwort; Reply = ftpclient.getReplyCode (); if (! ftpreply.ispositiveCompletion (Antwort)) {ftpclient.disconnect (); Erfolgserfolg; }} catch (ftpConnectionCLosedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } success = true; System.out.println ("Verbindung zu FTP -Server herstellen:" + this.hostname + "Erfolg..start Anmeldung"); Erfolgserfolg; } private statische ftpclientConfig config () {ftpclientConfig conf = new ftpclientConfig (ftpclientConfig.System.unix); conf.setRecentDateFormatstr ("mm Monat DD Datum HH: mm"); // conf.setRecentDateFormatstr ("(yyjyyy Year)? MM Monat DD Datum (HH: MM)?"); Rückkehr Conf; } / ** * Arbeitsverzeichnis ändern. ftpclient.ChangeworkingDirectory (remotedir); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } System.out.println ("Ändern Sie das Arbeitsverzeichnis in:" + remotedir); } / ** * kehren Sie zum vorherigen Level -Verzeichnis zurück (übergeordnetes Verzeichnis) * / public void toparentDir () {try {ftpclient.ChangetoparentDirectory (); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); }} / ***Listen Sie alle Dateien im aktuellen Arbeitsverzeichnis* / public String [] listAllFiles () {String [] names = this.listFiles ("*") auf; Gibt diese. SORT (Namen) zurück; } / ** * LIST -Übereinstimmungsdateien im angegebenen Arbeitsverzeichnis * * @param dir * exp: / cim / * @param file_regex * Die Wildcard ist * * / public String [] listAllFiles (String -Direx, String File_regex) {String [] namens Gibt diese. SORT (Namen) zurück; } /** * List -Matching -Dateien * * @param file_regex * Übereinstimmende Zeichen, Wildcard -Zeichen sind * * /public String [] listFiles (String File_regex) {try { /** * ftpfile [] remoteFiles = ftpclient.listfiles (filgex); * //System.out.println(remoteFiles.length); String [] name = new * String [remoteFiles.length]; if (remoteFiles! sonst * if (remoteFiles [i] .getName () == null || remoteFiles * [i] .getName (). Equals * (".") || remoteFiles [i] .getName (). Equals ("..") {name [i] = ""; *} else name [i] = remoteFiles [i] .getName (); * System.out.println (Name [i]); }} */ ftpclient.enterLocalPassivemode (); String [] name = ftpclient.listnames (file_regex) ;; if (name == null) return neue Zeichenfolge [0]; Gibt diese. SORT (Name) zurück; } catch (Ausnahme e) {// Todo automatisch generierter Block E. printstacktrace (); } neue String zurückgeben [0]; } public void lists (string reg) {try {string [] a = ftpclient.listnames (reg); if (a! = null) {für (string b: a) {System.out.println (b); }}} catch (ioException e) {// Todo automatisch generierter Block e.printstacktrace (); }} / ** * Setzen Sie den Typ der übertragenen Datei [Textdatei oder Binärdatei] * * @param Filetype * --Binary_File_Type, ascii_file_type * / public void setFiletype (int Filetype) {Try {ftpclient.setFiletype (Filetype); } catch (ioException e) {e.printstacktrace (); }}/ *** Datei hochladen** @param localFilePath* - -Local Dateipfad + Dateiname* @param newFileName* --New Dateiname*/ public void Uploadfile (String localFilePath, String newFileName) {// Upload Datei this.ftPclient.enterLecalpassive (); // // Passive -Buffin -BuffinStamPascPas -Null -1 -Null -1 -Null -Modus -Modus -Modus -Modus -Modus -Modus -Modus -Modus -Modus -Modus (); try {buffin = new bufferedInputStream (neuer FileInputStream (localFilePath)); boolean ifUpload = ftpclient.storefile (newFileName, buffin); if (! ifUpload) {System.out.println ("Die Datei fehlgeschlagen ..."); } else {System.out.println ("Die Datei erfolgreich hochladen ..."); }} catch (Ausnahme e) {e.printstacktrace (); } endlich {try {if (buffin! = null) buffin.close (); } catch (Ausnahme 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; try {buffin = new buferedInputStream (Datei); boolean ifUpload = ftpclient.storefile (newFileName, buffin); if (! ifUpload) {System.out.println ("Datei hochladen fehlgeschlagen ..."); } else {System.out.println ("Datei erfolgreich hochladen ..."); }} catch (Ausnahme e) {e.printstacktrace (); } endlich {try {if (buffin! = null) buffin.close (); } catch (Ausnahme e) {e.printstacktrace (); }}}/ ** * Datei herunterladen (Single) * * @param remoteFileName * --File -Name auf dem Server * @param localFileName * -Local Dateiname */ public boolean downloadFile (String RemoteFileName, String LocalFileName) {this.ftpclient.enterLecriveTeSame (); try {buffout = new bufferedOutputStream (new FileOutputStream (localFileName)); boolean ifDownLoad = ftpclient .Revievefile (RemoteFileName, Buffout); if (! ifdownload) {System.out.println ("Datei herunterladen fehlgeschlagen ..."); false zurückgeben; } else {System.out.println ("Datei erfolgreich herunterladen ..."); }} catch (Ausnahme e) {e.printstacktrace (); false zurückgeben; } endlich {try {if (buffout! = null) buffout.close (); } catch (Ausnahme e) {e.printstacktrace (); }} return true; } / *** Schließen Sie die FTP -Verbindung* / public void close () {try {if (ftpclient! = Null) {ftpclient.Logout (); ftpclient.disconnect (); }} catch (Ausnahme e) {e.printstacktrace (); }} / ** * Bubble sortiert String (von groß nach klein) * / public String [] sort (string [] str_array) {if (str_array == null) {neue nullpointerexception ("Das Str_array kann nicht null!"); } String tmp = ""; für (int i = 0; i <str_array.length; i ++) {für (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 = new ftputil2 ("192.168.1.112", 20011, "test1", "test1", "/", true); Ftputil2.DownloadFile ("test.txt", "d: //test.txt"); }}Das Folgende ist die ZIP -Werkzeugklasse:
Import Java.io.file; import Java.io.FileInputStream; importieren java.io.fileoutputStream; importieren java.io.ioException; importieren java.io.inputstream; importieren java.io.outputstream; Import Java.util.ArrayList; Import Java.util.Enumeration; importieren java.util.list; import Java.util.map; import Java.util.zip.zipentry; Import Java.util.zip.zipfile; import Java.util.zip.zipoutputStream; import org.apache.commons.io.ioutils; import com.ibatis.common.logging.log; import com.ibatis.common.logging.logfactory; public class ziputil {private statische endgültige log log = logFactory.getLog (Ziputil.Class); / *** komprimierte Datei** @param srcFile -Datei [] Liste der Dateien, die komprimiert werden müssen Versuchen Sie {// Erstellen Sie die ZIP -Datei ZipoutputStream out = neuer ZipoutputStream (outputStream); // Die Dateien für (int i = 0; i <srcFile.size (); i ++) {file file = srcFile.get (i) komprimieren; FileInputStream in = new FileInputStream (Datei); // ZIP -Eintrag zum Ausgabestream hinzufügen. out.putNextEntry (neu Zipentry (Datei.getName ())); // Bytes von der Datei in die ZIP -Datei int len übertragen; while ((len = in.read (buf))> 0) { //System.out.println(len+"======================================================================================= =========================================================ieben =========================================================ieben =========================================================ieben e) {log.Eror ("Ziputil Zipfiles Ausnahme:"+e); Byte [1024]; Ausgabestream. } catch (ioException e) {log.Eror ("Ziputil Zipfiles -Ausnahme:"+e); ZIPFILE) {try {// ZIP -Datei zipoutputStream = neuer ZipoutputStream (neuer FileOutputStream (ZipFile)); FileEntry.getValue (); out.closeEnry (); Datei * @param srcFile * @param zipfile * @see */ public static void zipbyarray (map <String, Byte []> SrcFile, Datei zipfile) {byte [] buf = new byte [1024]; Die Dateien system.out.println (SrcFile.EntrySet (). Size ()); Bytes von der Datei in die ZIP -Datei Byte [] Bytes = FileEnry.getValue (); // ioutils.tobytearray (in); Ausnahme: "+e); ZIPFILE (ZIPFILE); System.out.println (ZipEnryname); out.close (); Datei ("d: //1.jpg"); Ziputil.zipfiles (srcFile, Zipfile); Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.