web-dev-qa-db-fra.com

Obtenir le nom du fichier auprès de FileOutputStream

Existe-t-il un moyen d'obtenir le nom du fichier à partir d'une FileOutputStream ou d'une FileInputStream

39
Ebbu Abraham

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

31
Tom G

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.

14
Costi Ciudatu

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.

10
Hans Deragon

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.

  • Il n’existe pratiquement aucune raison pour que le code déclare la classe d’une référence à un objet de flux un fichier file stream. Le code IO peut utiliser un InputStream ou un OutputStteam. En effet, il devrait , dans le cadre de la programmation d’une interface et pour permettre le test unitaire à moindre coût de votre code IO (en permettant l’utilisation d’un simple flux de tableau d'octets en tant qu'objet fictif).
  • Espérez-vous peut-être utiliser le nom de fichier dans certains messages du journal? Si tel est le cas, cela signifie que vous essayez de consigner les erreurs de fichier IO trop basses dans la hiérarchie de votre programme. Peut-être saisissez-vous trop tôt les exceptions IO, au lieu de les laisser se propager aux parties supérieures de votre programme, qui savent que le IO est le fichier IO et connaissent le nom du fichier.
1
Raedwald