Existe-t-il un moyen d'obtenir le nom du fichier à partir d'une FileOutputStream
ou d'une FileInputStream
?
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
Aucune méthode publique ne renvoie la variable File
ou String
utilisée dans la construction du flux.
EDIT: Il en va de même pour FileInputStream
.
Cette fonctionnalité n'est pas fournie par le flux File-Input/Output-Stream prêt à l'emploi, mais rien ne vous empêche d'écrire votre propre sous-classe qui stocke le fichier (ou le nom de fichier) et fournit un getter pour celle-ci.
Je suggérerais d'implémenter une interface FileNameAware
pour cela, car les flux d'E/S sont généralement référencés avec les classes abstraites InputStream
/OutputStream
afin d'éviter de coupler votre application à des implémentations spécifiques.
Possible, avec réflexion : la réponse de Tom G est correcte, c'est-à-dire qu'il n'y a pas d'API pour obtenir le chemin. Cependant, si vous êtes bloqué comme moi avec un framework que vous ne pouvez pas modifier et que vous 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'en avais besoin pour le débogage).
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 rompre. De plus, j'ai omis de gérer les exceptions dans l'extrait ci-dessus par souci de clarté.
Non disponible en 1.6 et 1.7 Confirmé disponible en 1.8.
Ce 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 portant un nom. Cette dernière hypothèse est fausse pour les systèmes POSIX. Pour les systèmes POSIX, un fichier peut avoir un nombre quelconque de noms (liens physiques), y compris zéro. Le cas de zéro nom est assez commun pour les fichiers temporaires, afin de s'assurer que le fichier temporaire est supprimé à la sortie du programme.
J'ai écrit beaucoup de code de fichier IO et je n'ai jamais eu besoin de cette fonctionnalité. Le fait que vous le demandiez suggère que vous avez un défaut de conception. C'est-à-dire que vous avez un problème XY.