112 votes

Comment obtenir le chemin du répertoire des ressources de manière programmée

J'ai la disposition de répertoire suivante :

  • src
    • main
      • java
      • resources
        • sql (scripts pour la base de données)
        • spring (configuration)
      • webapp

Dans une classe ServletContextListener, je veux accéder aux fichiers sous le répertoire SQL et les lister. En gros, mon problème concerne le chemin, car je sais que lister les fichiers sous un répertoire se résume à :

File folder = new File(path);
File[] listOfFiles = folder.listFiles();

Peut-être pourrais-je utiliser l'objet ServletContextEvent pour essayer de construire un chemin vers resources/sql

public void contextInitialized(ServletContextEvent event) {
    event.getServletContext(); //(getRealPath etc.)
}

Est-ce qu'il existe quelque chose pour définir ce chemin de manière relative, sans codage en dur ? Quelque chose comme new File("classpath:sql") (de préférence avec Spring si possible) ou que devrais-je faire avec le servletContext pour pointer vers resources/sql ?

87voto

Dev Points 5487

Je suppose que le contenu de src/main/resources/ est copié dans WEB-INF/classes/ à l'intérieur de votre fichier .war au moment de la construction. Si c'est le cas, vous pouvez simplement faire (en remplaçant les vraies valeurs par le nom de la classe et le chemin chargé).

URL sqlScriptUrl = MyServletContextListener.class
                       .getClassLoader().getResource("sql/script.sql");

76voto

whyem Points 1805

Enfin, voici ce que j'ai fait:

private File getFileFromURL() {
    URL url = this.getClass().getClassLoader().getResource("/sql");
    File file = null;
    try {
        file = new File(url.toURI());
    } catch (URISyntaxException e) {
        file = new File(url.getPath());
    } finally {
        return file;
    }
}

...

File folder = getFileFromURL();
File[] listOfFiles = folder.listFiles();

20voto

samlewis Points 3650
import org.springframework.core.io.ClassPathResource;

...

File folder = new ClassPathResource("sql").getFile();
File[] listOfFiles = folder.listFiles();

Il est à noter que cela limitera vos options de déploiement, ClassPathResource.getFile() ne fonctionne que si le conteneur a extrait (dézippé) votre fichier war.

11voto

grep Points 2041

Il suffit d'utiliser la classe com.google.common.io.Resources. Exemple :

 URL url = Resources.getResource("nom du fichier")

Ensuite, vous avez des méthodes comme : .getContent(), .getFile(), .getPath() etc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X