web-dev-qa-db-fra.com

lire le fichier dans classpath

Voici ce que je veux faire et je me demande s’il existe des cours de printemps qui faciliteront la mise en œuvre. Je n'ai pas à utiliser le ressort pour résoudre ce problème particulier, je l'implémente simplement avec tout le reste.

Dans ma couche DAO, je veux externaliser mes fichiers SQL, à savoir 1 SQL par fichier. Je veux lire et mettre en cache la déclaration SQL même peut-être comme un singleton de haricot printanier. Mais dans mes difficultés initiales, je ne parviens pas à charger un fichier SQL dans le classpath ...

Y at-il quelque chose au printemps pour aider avec ça? J'ai parcouru la documentation, mais rien ne me saute aux yeux.

Voici un peu ce que je recherche… mais je n'arrive pas à le faire reconnaître le fichier ou peut-être le chemin de classe… pas vraiment sûr que quelque chose doit être défini dans applicationContext?

Voici quelques tentatives qui ne semblent pas fonctionner ... à la fois au printemps et juste en Java.

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")));

Des pensées?

31
Greg J

Essayez de faire en sorte que Spring l’injecte, en supposant que vous utilisiez Spring comme cadre d’injection de dépendance.

Dans ta classe, fais quelque chose comme ça:

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

Et ensuite, dans votre fichier de contexte d'application, dans la définition du bean, définissez une propriété:

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

Et Spring devrait être assez intelligent pour charger le fichier à partir du classpath et le donner à votre bean comme ressource.

Vous pouvez également regarder dans PropertyPlaceholderConfigurer , et stocker tout votre code SQL dans des fichiers de propriétés et simplement injecter chaque fichier séparément si nécessaire. Il y a beaucoup d'options.

34
user7094

Changement . à/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 lorsque vous utilisez Class.getResourceAsStream() vs ClassLoader.getResourceAsStream.getSystemResourceAsStream utilise le system classloader 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.

39
Jon Skeet
import Java.io.BufferedReader;
import Java.io.File;
import Java.io.FileNotFoundException;
import Java.io.FileReader;
import Java.io.IOException;

public class readFile {
    /**
     * feel free to make any modification I have have been here so I feel you
     * 
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        File dir = new File(".");// read file from same directory as source //
        if (dir.isDirectory()) {
            File[] files = dir.listFiles();
            for (File file : files) {
                // if you wanna read file name with txt files
                if (file.getName().contains("txt")) {
                    System.out.println(file.getName());
                }

                // if you want to open text file and read each line then
                if (file.getName().contains("txt")) {
                    try {
                        // FileReader reads text files in the default encoding.
                        FileReader fileReader = new FileReader(
                                file.getAbsolutePath());
                        // Always wrap FileReader in BufferedReader.
                        BufferedReader bufferedReader = new BufferedReader(
                                fileReader);
                        String line;
                        // get file details and get info you need.
                        while ((line = bufferedReader.readLine()) != null) {
                            System.out.println(line);
                            // here you can say...
                            // System.out.println(line.substring(0, 10)); this
                            // prints from 0 to 10 indext
                        }
                    } catch (FileNotFoundException ex) {
                        System.out.println("Unable to open file '"
                                + file.getName() + "'");
                    } catch (IOException ex) {
                        System.out.println("Error reading file '"
                                + file.getName() + "'");
                        // Or we could just do this:
                        ex.printStackTrace();
                    }
                }
            }
        }

    }`enter code here`

}
0
Helper