2015-04-15 10 views
0

Je souhaite créer une chaîne à partir du contenu du fichier. Selon this answer je le fais de cette façon:Impossible d'obtenir le fichier de classpath (en utilisant NIO2)

private static String buildStringFromTemplate(String stringTemplatePath) throws IOException { 
    byte[] encoded = Files.readAllBytes(Paths.get(stringTemplatePath)); 
    return new String(encoded, "UTF-8"); 
} 

(Si je comprends bien c'est un chemin d'une nouvelle API NiO2, qui est une partie de Java 7.) paramètre

de stringTemplatePath est nom du fichier ("template.html"). Je vérifie l'emplacement de ce fichier. Il est dans le classpath: ../classes/template.html

Après avoir appelé cette fonction que je reçois une exception:

java.nio.file.NoSuchFileException: template.html 

J'envoyer peut-être paramètre de nom de fichier dans une mauvaise façon? J'ai essayé d'envoyer cette modification: "file: ///template.html" et "classpath: template.html", mais cela n'a pas aidé.

Aussi j'ai essayé ce code:

private static String buildStringFromTemplate(String stringTemplatePath) throws IOException { 
    File file = new File(stringTemplatePath); 
    String absolutePath = file.getAbsolutePath(); 
    byte[] encoded = Files.readAllBytes(Paths.get(absolutePath)); 
    return new String(encoded, "UTF-8"); 
} 

J'ai appelé cette fonction, je me exception suivante:

java.nio.file.NoSuchFileException: /opt/repo/versions/8.0.9/temp/template.html 

Ainsi, le fichier dans classpath parce nouveau fichier (stringTemplatePath) peut créer un fichier . Mais ce fichier a un chemin très étrange (/opt/repo/versions/8.0.9/temp/template.html). J'utilise Jelastic comme hébergeur (environnement: Java 8, Tomcat 8), si c'est le metter.


MISE À JOUR: TRAVAIL FINAL SOLUTION:

private static String buildStringFromTemplate(String stringTemplatePath) throws IOException { 
    InputStream inputStream = MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath); 
    return IOUtils.toString(inputStream, "UTF-8"); 
} 

IOUtils est classe util de Apache Commons IO.

Note impotant:

Si j'invoque simplement .getResourceAsStream (...) de classe, fichier de ressources sera pas trouvé et méthode retourne null:

MyClass.class.getResourceAsStream(stringTemplatePath); 

Donc, j'appelle .getClassLoader() avant d'appeler .getResourceAsStream (...) et il fonctionne parfaitement:

MyClass.class.getClassLoader().getResourceAsStream(stringTemplatePath); 
+1

N'utilisez pas Path (ou File, en 2015 n'utilisez aucun fichier) pour accéder aux ressources sur le système de fichiers! Il y a '.getResourceAsStream()' pour cela – fge

+0

@fge Thx! Avec **. GetResourceAsStream() ** tout fonctionne bien! Voulez-vous poster votre réponse? – Sergey

Répondre

2

Vous ne devriez pas essayez et accédez aux ressources de votre chemin de classe en tant que Path s.

Bien que cela fonctionne très probablement lorsque votre projet se trouve dans votre configuration IDE, il ne le sera pas dès que votre projet est emballé en tant que pot; il est alors impossible d'y accéder en utilisant même Path (et même si vous pouvez ouvrir des fichiers zip, donc des pots, comme FileSystem s).

Utilisez les méthodes dédiées à le faire à la place, à commencer par .getResourceAsStream():

final InputStream in = MyClass.class.getResourceAsStream("/path/to/resource"); 

Notez que vous aurez besoin de vérifier si le code de retour de cette méthode est null (ce qui est ce qui est retourné si la ressource est pas trouvé dans le classpath).

+0

Malheureusement ** MyClass.class.getResourceAsStream (...); ** ne fonctionne pas pour moi. Dans mon cas, le code suivant fonctionne: ** MyClass.class.getClassLoader(). GetResourceAsStream (...); ** Merci encore pour votre aide! – Sergey

1

Si le fichier est vraiment partie du classpath vous devez utiliser: ClassName.class.getResourceAsStream("/file name") ce retour InputStraem
ou
ClassName.class.getResource("/file name") cette URL de retour