2009-05-17 4 views
4

J'ai un fichier jar qui utilise des fichiers txt. Afin de les obtenir, il utilise la fonction Class.getResourceAsStream.getResourceAsStream ne fonctionne pas pour chaque classe?

Class A 
{ 
    public InputStream getInputStream(String path) throws Exception { 
     try { 
      return new FileInputStream(path); 
     } catch (FileNotFoundException ex) { 
      InputStream inputStream = getClass().getResourceAsStream(path); 
      if (inputStream == null) 
       throw new Exception("Failed to get input stream for file " + path); 
      return inputStream; 
     } 
    } 
} 

Ce code fonctionne parfaitement.

Le problème est que, si je définis la classe A comme extends java.io.File, le InputStream I obtenu à partir de getResourceAsStream est nul.

En outre, si je laisse la classe A comme classe ordinaire (non héréditaire), et définir la classe B comme suit:

Class B extends java.io.File 
{ 
    public InputStream getInputStream(String path) throws Exception 
    { 
    return new A().getInputStream(path); 
} 
} 

le InputStream retourné est toujours nul.

Quel est le problème? Est-il un moyen d'accéder au fichier de la classe qui hérite File?

Merci,

Répondre

10

Je soupçonne que c'est plus à faire avec les paquets que l'héritage.

Si votre classe est dans un paquet, alors getResourceAsStream() sera relatif à ce paquet, sauf si vous le lancez avec "/" (ce qui en fait une ressource "absolue"). Une alternative est d'utiliser getClass().getClassLoader().getResourceAsStream() qui n'a aucune idée d'un chemin étant relatif à un paquet.

Juste le sous-classement File ne devrait pas affecter le comportement du tout. Si vous y croyez vraiment, veuillez poster un programme court mais complet pour démontrer le problème.

+0

Vous avez raison. Le problème était différent. Vois ma réponse. Merci! – Dikla

0

Désolé, le problème est différent. (Pas de problème en fait ...)

Dans la classe qui a hérité de java.io.File j'ai utilisé getPath() afin d'obtenir le chemin vers la ressource. Mais le chemin avait des barres obliques inverses à la place des barres obliques normales (puisque je travaille sur Windows OS). Lorsque j'ai utilisé des barres obliques normales, cela fonctionnait même lorsque j'utilisais la classe héritée.

1

IMHO il est toujours préférable d'utiliser getClass().getClassLoader().getResourceAsStream() car le code ci-dessus peut échouer si vous sous-classe (et la sous-classe est dans un autre pacakge) et appelez une méthode parents.

4

Voici quelques exemples qui sauvegardent l'explication de Jon Skeet:

Prémisse: Vous avez un my.package.A de classe qui dépend de foo.txt.

  1. Si vous utilisez my.package.A.class.getResourceAsStream (« foo.txt ») et vous placez foo.txt mon/paquet/foo.txt dans votre fichier jar, puis lorsque vous exécutez la classe A il devrait trouver foo.txt. Si vous utilisez my.package.A.class.getClassLoader(). GetResourceAsStream ("foo.txt") puis placez foo.txt dans n'importe quel dossier du classpath, lorsque vous lancerez la classe A, il devrait trouver foo. SMS. Si vous utilisez my.package.A.class.getResourceAsStream ("/ foo.txt") et que vous placez foo.txt dans /foo.txt dans mon fichier jar, alors lorsque vous exécutez le projet A, vous devriez trouver foo.txt.

+0

J'aime vraiment cette explication! Merci beaucoup de l'avoir clarifié ... –