2010-02-28 12 views
42

Ich habe diese Zeile in meinem Programm zu konvertieren?Wie Inputstream Fileinputstream

+9

Warum benötigen Sie einen FileInputStream? – nos

+2

Sind Sie sicher, dass es tatsächlich eine Datei gibt, die Ihre Ressource unterstützt, und nicht einen Eintrag in einer JAR-Datei? –

Antwort

53

Verwenden Sie stattdessen ClassLoader#getResource(), wenn der URI einen gültigen lokalen Dateisystempfad darstellt.

URL resource = classLoader.getResource("resource.ext"); 
File file = new File(resource.toURI()); 
FileInputStream input = new FileInputStream(file); 
// ... 

Wenn dies nicht der Fall ist (z. B. JAR), ist es am besten, sie in eine temporäre Datei zu kopieren.

Path temp = Files.createTempFile("resource-", ".ext"); 
Files.copy(classLoader.getResourceAsStream("resource.ext"), temp, StandardCopyOption.REPLACE_EXISTING); 
FileInputStream input = new FileInputStream(temp.toFile()); 
// ... 

Das heißt, ich sehe nicht wirklich zu tun, keinen Nutzen so, oder es muss durch eine schlechte Hilfsklasse/Verfahren notwendig werden, die FileInputStream statt InputStream erfordert. Wenn Sie können, reparieren Sie einfach die API, um nach einem stattdessen zu fragen. Wenn es ein Drittanbieter ist, melden Sie es als Fehler. Ich würde in diesem speziellen Fall auch Fragezeichen um den Rest dieser API setzen.

+0

anstelle von 'FileInputStream input = new FileInputStream (temp.toFile());', ich habe 'FileInputStream input = new FileInputStream (temp.toString()); '. weil 'temp.toFile' möglicherweise eine leere (FileInputStream) Eingabe hinterlassen würde. Aus dem möglichen Grund können Sie Path.toFile überprüfen java api doc –

11

Lange Geschichte kurz: Verwenden Sie FileInputStream nicht als Parameter oder Variablentyp. Verwenden Sie die abstrakte Basisklasse, in diesem Fall InputStream.

+17

Ich mag diese Antwort nicht, manchmal brauchen Sie wirklich eine FileInputStream, weil Sie Methoden von seiner API wie getChannel() zum Beispiel brauchen, und er fragte nicht, ob es Es ist eine gute Idee, keinen InputStream zu verwenden, nur wenn es möglich ist, einen Dateieingangsstrom aus einem Eingabestream zu erstellen. Sie hätten einen Kommentar verwenden können, anstatt eine neue Antwort hinzuzufügen. – arielsan

+0

Was ist mit java.util.Properties? – sloven

0

Sie brauchen so etwas wie:

URL resource = this.getClass().getResource("/path/to/resource.res"); 
    File is = null; 
    try { 
     is = new File(resource.toURI()); 
    } catch (URISyntaxException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    try { 
     FileInputStream input = new FileInputStream(is); 
    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

Aber es wird nur innerhalb Ihrer IDE, nicht in runnable JAR arbeiten. Ich hatte dasselbe Problem erklärt here.