31 votes

lire le fichier dans classpath

Voici ce que je veux faire et je me demandais si il n'y a aucune Printemps de classes qui vont aider à la mise en œuvre. Je n'ai pas utiliser de printemps pour ce problème particulier, je suis juste de les mettre en œuvre avec tout le reste.

Dans ma couche DAO je veux extérioriser mes fichiers sql aka 1 sql par fichier. Je veux lire et cache l'instruction sql peut-être même comme un printemps bean singleton. Mais dans mon initiale de la peine, je vais avoir un problème vient de charger un fichier sql dans le classpath...

Est-il rien de printemps pour aider avec ça? J'ai été par le biais de la documentation, mais rien n'est de sauter hors de moi.

Voici un peu ce que je suis après.. mais je n'arrive pas à reconnaître le fichier ou peut-être le chemin de la classe... pas vraiment sûr de quelque chose, doivent être définis dans applicationContext?

Voici un couple de tentatives qui ne semblent pas fonctionner... printemps new'ish et juste java new'ish.

reader = new BufferedReader(new InputStreamReader(new ClassPathResource("com.company.app.dao.sql.SqlQueryFile.sql").getInputStream())

reader = new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("com.company.app.dao.sql.SqlQueryFile.sql")));

Toutes les pensées?

39voto

Jon Skeet Points 692016

Changement . vers / comme séparateur de chemin et utilisez getResourceAsStream :

 reader = new BufferedReader(new InputStreamReader(
    getClass().getClassLoader().getResourceAsStream(
        "com/company/app/dao/sql/SqlQueryFile.sql")));
 

ou

 reader = new BufferedReader(new InputStreamReader(
    getClass().getResourceAsStream(
        "/com/company/app/dao/sql/SqlQueryFile.sql")));
 

Notez la barre oblique principale lorsque vous utilisez Class.getResourceAsStream() vs ClassLoader.getResourceAsStream . getSystemResourceAsStream utilise le chargeur de classe système qui n'est pas ce que vous voulez.

Je soupçonne que l'utilisation de barres obliques au lieu de points fonctionnerait également pour ClassPathResource .

34voto

Phill Sacre Points 16238

Essayer d'obtenir de Printemps de l'injecter, en supposant que vous êtes à l'aide de Printemps comme une injection de dépendance cadre.

Dans votre classe, faire quelque chose comme ceci:

public void setSqlResource(Resource sqlResource) {
    this.sqlResource = sqlResource;
}

Et puis dans votre application fichier de contexte, dans le bean définition, il suffit de définir une propriété:

<bean id="someBean" class="...">
    <property name="sqlResource" value="classpath:com/somecompany/sql/sql.txt" />
</bean>

Et le Printemps devrait être assez intelligent pour charger le fichier dans le chemin de classe et de le donner à votre bean comme une ressource.

Vous pouvez également regarder dans PropertyPlaceholderConfigurer, et stocker tous vos SQL dans la propriété des fichiers et juste injecter séparément chacun d'eux en cas de besoin. Il ya beaucoup d'options.

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