Comment obtenir un chemin/nom de fichier à partir d'un InputStream en Java?Chemin d'accès/nom de fichier à partir de InputStream
Répondre
Ce n'est pas possible. (pas à partir de FileInputStream dans l'API Java). Le constructeur FileInputStream
ne stocke pas ces informations dans tous les domaines:
public FileInputStream(File file) throws FileNotFoundException {
String name = (file != null ? file.getPath() : null);
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(name);
}
if (name == null) {
throw new NullPointerException();
}
fd = new FileDescriptor();
open(name);
}
Vous ne pouvez pas car le InputStream
peut ne pas avoir été un fichier ou un chemin d'accès. Vous pouvez implémenter votre propre InputStream
qui génère des données à la volée
Deux importants principes de conception orientée objet vous empêchent de faire ce que vous demandez: l'abstraction et l'encapsulation.
- Abstraction est le processus de définition d'un concept général qui a seulement les détails nécessaires à son utilisation dans un contexte particulier (plus de détails here). Dans cette situation, l'abstraction est
InputStream
, qui est une interface générale qui peut fournir des octets, indépendamment de la source de ces octets. L'abstraction d'unInputStream
n'a pas de concept de chemin de fichier; Cela ne concerne que les implémentations particulières deInputStream
. - L'encapsulation est le processus de masquage des détails d'implémentation d'une classe par les consommateurs/utilisateurs de cette classe. Dans cette situation particulière,
FileInputStream
encapsule les détails du fichier en cours de lecture car, en tant queInputStream
, cette information n'est pas pertinente pour l'utilisation. Le champ d'instancepath
est encapsulé et n'est donc pas disponible pour les utilisateurs de la classe.
Ceci étant dit, il est possible d'accéder à la variable path
si vous êtes prêt à accepter des limites importantes. Fondamentalement, l'essentiel est que vous pouvez vérifier si le InputStream
est, en fait, une instance de FileInputStream
et, si c'est le cas, utilisez la réflexion pour lire le champ d'instance path
. Je vais laisser de côté les détails de faire cet accès, car il est facilement décelable dans les docs Java et en ligne, et pas vraiment une bonne chose à faire dans la plupart des contextes. Puisque la question ne fournit pas de contexte expliquant pourquoi, il est difficile d'offrir des approches plus raisonnables.