2011-02-08 3 views

Répondre

28

On dirait que la réponse est non:
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

Il n'y a pas les méthodes publiques qui renvoient le File ou String utilisés lors du cours d'eau.

EDIT: La même chose vaut pour FileInputStream.

+1

Je suppose que la même réponse est pour FileInputStream trop juste? –

+3

@ Stephen- J'ai lu les documents, mais je voulais juste confirmer que je n'ai rien manqué. –

12

Cette fonctionnalité n'est pas fournie par File-Input/Output-Stream prête à l'emploi, mais rien ne vous empêche d'écrire votre propre sous-classe qui stocke le File (ou fileName) et fournit un getter.

Je suggère une mise en œuvre de l'interface FileNameAware pour cela), comme E/S cours d'eau sont habituellement utilisée avec les classes abstraites InputStream/OutputStream pour éviter le couplage de votre application avec des implémentations spécifiques.

-2

Ma réponse arrive un peu tard. J'ai frappé le même problème en écrivant du code. Pour contourner cela, j'ai utilisé un FileOutputStream(File file) au lieu de FileOutputStream(String location) parce que je peux alors faire file.getAbsolutePath(). Voir l'exemple d'extrait ci-dessous.

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

Pourquoi le vote négatif? Quelqu'un peut-il expliquer? –

+10

Peut-être parce que le fichier (Out/In) putStream n'a pas d'importance ici que vous détenez le fichier. Si la méthode renvoie uniquement un flux, vous n'avez aucune chance (avec l'utilisation directe de FileInputStream) pour récupérer le fichier sous-jacent ou l'emplacement –

7

possible, avec une réflexion: réponse Tom G est exact, à savoir qu'il n'y a pas API pour obtenir le chemin. Cependant, si vous êtes coincé comme moi avec un framework vous ne pouvez pas changer et ne pouvez pas obtenir le nom de fichier par un autre moyen, vous pouvez utiliser la réflexion pour obtenir le chemin (dans mon cas, j'avais besoin de déboguer).

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

De toute évidence, la mise en œuvre de FileOutpuStream pourrait changer avec le temps et ce code pourrait se briser. En outre, j'ai omis la gestion des exceptions dans l'extrait ci-dessus à des fins de clarté.

Non disponible en 1.6 et 1.7 Confirmé disponible en 1.8.

+0

Il n'existe aucun champ de ce type dans JDK 1.6, 1.7 ou 1.8. – EJP

+0

EJP, vous avez tort. Il y a un tel champ. Je viens de le tester sous Java 1.8.0_112-b16. Code complet ici: –

+0

import java.io.FileOutputStream; import java.lang.reflect.Field; public class FileOutputStreamTest { public static void main (String args []) throws Exception { FileOutputStream outputStream = new FileOutputStream ("./ FileOutputStreamTest.java"); Champ pathField = FileOutputStream.class.getDeclaredField ("path"); pathField.setAccessible (true); String path = (Chaîne) pathField.get (outputStream); System.out.println ("path =" + chemin); } } –

1

Ceci n'est pas possible, même en principe. L'hypothèse de la question est que chaque flux d'entrée de fichier est associé à un fichier qui a un nom. Cette dernière hypothèse est fausse, pour les systèmes POSIX. Pour les systèmes POSIX, un fichier peut avoir n'importe quel nombre de noms (liens durs), y compris zéro. Le cas de zéro nom est assez commun pour les fichiers temporaires, pour s'assurer que le fichier temporaire est supprimé à la sortie du programme. J'ai écrit beaucoup de code IO, et je n'ai jamais eu besoin de cette fonctionnalité. Ce que vous demandez suggère que vous avez un défaut de conception. Autrement dit, vous avez un problème XY.

  • Il n'y a presque aucune raison pour que le code de déclarer la classe d'une référence à un objet de flux à un flux de fichier . Le code IO peut utiliser un InputStream ou un OutputStteam. En effet, il devrait, dans le cadre de la programmation d'une interface, et de permettre des tests unitaires bon marché de votre code IO (en permettant l'utilisation d'un simple flux tableau d'octets comme un objet maquette).
  • Souhaitez-vous peut-être utiliser le nom de fichier dans certains messages de journal? Si tel est le cas, cela signifie que vous tentez de consigner des erreurs d'E/S de fichier trop faibles dans la hiérarchie de votre programme. Peut-être que vous attrapez des IOExceptions trop tôt, plutôt que de les laisser se propager à des parties plus élevées de votre programme, sachant que l'E/S est un fichier E/S et connaissez le nom du fichier.
Questions connexes