2017-03-29 2 views
-3

Ich muss ein Stück Java-Code nachrüsten, der mit Java 1.6 kompatibel sein muss, und ich suche nach einer Alternative für Fileoutputstream in der folgenden Funktion. Ich benutze das apache.commons FTP-Paket.FileOutputStream Alternative für Java 1.6

import org.apache.commons.net.ftp.FTP; 
import org.apache.commons.net.ftp.FTPClient; 
import org.apache.commons.net.ftp.FTPReply; 

FTPClient ftp = null; 

public FTPFetch(String host, int port, String username, String password) throws Exception 
{ 

    ftp = new FTPClient(); 
    ftp.setConnectTimeout(5000); 
    ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out))); 
    int reply; 
    ftp.connect(host, port); 
    reply = ftp.getReplyCode(); 
    if (!FTPReply.isPositiveCompletion(reply)) 
    { 
     ftp.disconnect(); 
     throw new Exception("Exception in connecting to FTP Server"); 
    } 
    if (ftp.login(username, password)) 
    { 
     ftp.setFileType(FTP.BINARY_FILE_TYPE); 
     ftp.enterLocalActiveMode(); 
    } else 
    { 
     disconnect(); 
     errorLog.fatal("Remote FTP Login Failed. Username or Password is incorrect. Please update in configuration file."); 
     System.exit(1); 
    } 
} 

try (FileOutputStream fos = new FileOutputStream(destination)) 
    { 
     if (this.ftp.retrieveFile(source, fos)) 
     { 
      return true; 
     } else 
     { 
      return false; 
     } 
    } catch (IOException e) 
    { 
     return false; 
    } 
+9

'FileOutputStream' existiert si nce JDK 1.0 – Berger

+2

hinweis: 'if (condition) {return true; } else {return false; } 'ist dasselbe wie' return condition; ' –

+0

Danke, ich habe den Code geändert, um das lokal zu beheben. – Tacitus86

Antwort

4

der Code kompiliert nicht in Java 1.6, weil Sie verwenden try-with-Ressourcen

Das try-with-Ressourcen Statement

Die Try-mit-Ressourcen Aussage ein Versuch ist Anweisung, die eine oder mehrere Ressourcen deklariert. Eine Ressource ist ein Objekt, das nach Abschluss des Programms geschlossen werden muss. Die try-with-resources-Anweisung stellt sicher, dass jede Ressource am Ende der Anweisung geschlossen wird. Jedes Objekt, das java.lang.AutoCloseable implementiert, das alle Objekte enthält, die java.io.Closeable implementieren, kann als Ressource verwendet werden.

...

In diesem Beispiel erklärt die Ressource in try-mit-Ressourcen-Anweisung ist eine BufferedReader. Die Deklarationsanweisung wird unmittelbar nach dem Schlüsselwort try in Klammern angezeigt. Die Klasse BufferedReader implementiert in Java SE 7 und höher die Schnittstelle java.lang.AutoCloseable. Da die BufferedReader-Instanz in einer try-with-resource-Anweisung deklariert ist, wird sie geschlossen, unabhängig davon, ob die try-Anweisung normal oder abrupt ausgeführt wird (als Ergebnis der Methode BufferedReader.readLine, die eine IOException auslöst).

Vor der Java SE 7, können Sie einen Block verwenden, schließlich sicherstellen, dass eine Ressource, unabhängig davon, ob die Anweisung abgeschlossen ist normalerweise Versuch geschlossen oder abrupt. Im folgenden Beispiel wird ein schließlich anstelle eines Try-mit-Ressourcen Anweisung blockieren:

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

die Alternative ist:

FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(destination); 

    if(this.ftp.retrieveFile(source, fos)) { 
    return true; 
    } else { 
    return false; 
    } 
} catch (IOException e) { 
    return false; 
} finally { 
    if(fos != null) 
    fos.close(); 
} 
+1

Danke! Guter Fang. – Tacitus86

+0

In der Tat. Ich warte nur auf die obligatorische Zeit, um zu akzeptieren. – Tacitus86

3

Try-mit-Ressourcen (try (AutoClosable ...)) war nicht verfügbar in Java 6. Lassen Sie das und Sie sollten in Ordnung sein, zB:

FileOutputStream fos = null; 
try { 
    fos = new FileOutputStream(destination); 
    return this.ftp.retrieveFile(source, fos); 
} catch (IOException e) { 
    return false; 
} finally { 
    if (fos != null) 
    fos.close(); 
}