2011-02-08 19 views

risposta

28

Sembra che la risposta è no:
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html
http://docs.oracle.com/javase/7/docs/api/index.html?java/io/FileOutputStream.html

Non ci sono metodi pubblici che restituire il File o String utilizzato nella costruzione del torrente.

MODIFICA: Lo stesso vale per FileInputStream.

+1

Immagino che la stessa risposta sia per FileInputStream anche a destra ?? –

+3

@ Stephen Ho letto i documenti, ma volevo solo confermare che non mi sono perso nulla. –

12

Questa funzione non è fornita dal file-Input/Output-Stream out-of-the-box, ma nulla ti impedisce di scrivere la propria sottoclasse che memorizza il File (o fileName) e fornisce un getter per questo.

vorrei suggerire l'attuazione di alcune FileNameAware interfaccia per questo), come I/O Flussi sono di solito riferimento con l'InputStream/OutputStream classi astratte per evitare l'accoppiamento la vostra applicazione con le implementazioni specifiche.

-2

La mia risposta arriva un po 'in ritardo. Ho riscontrato lo stesso problema durante la scrittura di un codice.

Per aggirare il problema, ho utilizzato uno FileOutputStream(File file) anziché FileOutputStream(String location) perché posso quindi eseguire file.getAbsolutePath(). Vedi lo snippet di esempio qui sotto.

String location = "some.relative.path.txt"; 
File file = new File(location); 
FileOutputStream f = new FileOutputStream(file); 
String question = "<h3>"+header+"</h3>"; 
String finalSource = HTMLWrapper.HTML_START+question +htmlContent; 
f.write(finalSource.getBytes()); 
f.flush(); 
f.close(); 
System.out.println("The report is now available at"+file.getAbsolutePath()); 
+0

Perché il voto negativo? Qualcuno può spiegare? –

+10

Forse perché il file (Out/In) putStream non ha importanza qui mentre si tiene il file. Se il metodo restituisce solo un flusso, non si ha alcuna possibilità (con utilizzo diretto di FileInputStream) di recuperare il file sottostante o la posizione –

7

Possibile, con la riflessione: risposta Tom G è corretto, vale a dire non v'è alcuna API per ottenere il percorso. Tuttavia, se sei bloccato come me con un framework che non puoi cambiare e non puoi ottenere il nome del file con qualsiasi altra media, puoi usare reflection per ottenere il percorso (nel mio caso, ne avevo bisogno per scopi di debug).

Field pathField = FileOutputStream.class.getDeclaredField("path"); 
pathField.setAccessible(true); 
String path = (String) pathField.get(outputStream); 

Ovviamente, l'implementazione di FileOutpuStream potrebbe cambiare nel tempo e questo codice potrebbe interrompersi. Inoltre, ho omesso la gestione delle eccezioni nello snippet qui sopra a fini di chiarezza.

Non disponibile in 1.6 e 1.7 Confermato disponibile in 1.8.

+0

Non esiste un campo di questo tipo in JDK 1.6, 1.7 o 1.8. – EJP

+0

EJP, ti sbagli. C'è un tale campo. L'ho appena testato sotto Java 1.8.0_112-b16. Codice completo qui: –

+0

import java.io.FileOutputStream; import java.lang.reflect.Field; public class FileOutputStreamTest { static void main (String args []) pubbliche genera un'eccezione { FileOutputStream outputStream = new FileOutputStream ("./ FileOutputStreamTest.java"); Field pathField = FileOutputStream.class.getDeclaredField ("percorso"); pathField.setAccessible (true); String path = (String) pathField.get (outputStream); System.out.println ("percorso =" + percorso); } } –

1

Questo non è possibile, anche in linea di principio. L'assunto della domanda è che ogni flusso di input di file è associato a un file che ha un solo nome. Quest'ultima ipotesi è errata, per i sistemi POSIX. Per i sistemi POSIX, un file può avere un numero qualsiasi di nomi (hard link), incluso zero. Il caso di nomi zero è abbastanza comune per i file temporanei, per garantire che il file temporaneo venga rimosso all'uscita dal programma.

Ho scritto molto codice IO file e non ho mai avuto bisogno di questa funzionalità. Che lo chiedi suggerisce che hai un difetto di progettazione. Cioè, hai un problema XY.

  • Non c'è quasi alcun motivo per il codice per dichiarare la classe di un riferimento a un oggetto flusso di essere un file di flusso. Il codice IO può utilizzare un InputStream o OutputStteam. Infatti, è , come parte della programmazione di un'interfaccia, e per consentire il test dell'unità a basso costo del proprio codice IO (abilitando l'uso di un semplice flusso di array di byte come oggetto fittizio).
  • Forse speri di utilizzare il nome file in alcuni messaggi di registro? In tal caso, ciò suggerisce che stai cercando di registrare errori di I/O file troppo bassi nella gerarchia del programma. Forse stai intercettando le IOException troppo presto, piuttosto che lasciarle propagare a parti superiori del tuo programma, che sanno che l'IO è un file IO e conosce il nome del file.