wake-up-neo.com

datei im Klassenpfad lesen

Hier ist, was ich tun möchte, und ich frage mich, ob es Spring-Klassen gibt, die bei der Implementierung helfen werden. Ich muss den Frühling nicht für dieses spezielle Problem verwenden, ich implementiere ihn einfach mit allem anderen.

In meiner DAO-Schicht möchte ich meine SQL-Dateien (1 SQL pro Datei) externalisieren. Ich möchte die SQL-Anweisung sogar als Spring Bean-Singleton lesen und zwischenspeichern. In meinen anfänglichen Kämpfen habe ich jedoch ein Problem beim Laden einer SQL-Datei in den Klassenpfad ...

Gibt es im Frühling etwas, das dabei helfen kann? Ich habe die Dokumentation durchgesehen, aber nichts springt auf mich zu.

Hier ist eine Art von dem, was ich suche ... aber ich kann nicht die Datei oder den Klassenpfad erkennen ... nicht wirklich sicher muss etwas in applicationContext definiert werden?

Hier sind ein paar Versuche, die scheinbar nicht funktionieren ... sowohl frühlingshaft als auch nur Java'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")));

Irgendwelche Gedanken?

31
Greg J

Versuchen Sie, Spring dazu zu bringen, es einzuspritzen, vorausgesetzt, Sie verwenden Spring als Rahmen für die Abhängigkeitsinjektion.

Machen Sie in Ihrer Klasse so etwas:

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

Und dann legen Sie in Ihrer Anwendungskontextdatei in der Bean-Definition einfach eine Eigenschaft fest:

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

Und Spring sollte klug genug sein, die Datei aus dem Klassenpfad zu laden und als Bean an Ihre Bean zu übergeben.

Sie können auch in PropertyPlaceholderConfigurer nachschauen, Ihre gesamten SQL-Dateien in Eigenschaftendateien speichern und einfach einzeln einfügen, wenn dies erforderlich ist. Es gibt viele Möglichkeiten.

34
user7094

Veränderung . zu/als Pfadtrennzeichen und verwenden Sie getResourceAsStream:

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

oder

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

Beachten Sie den führenden Schrägstrich bei der Verwendung von Class.getResourceAsStream() vs ClassLoader.getResourceAsStream.getSystemResourceAsStream verwendet den system classloader.

Ich vermute, dass die Verwendung von Schrägstrichen anstelle von Punkten auch für ClassPathResource funktionieren würde.

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