Читать файл в classpath

Вот что я хочу сделать, и мне интересно, есть ли классы Spring, которые помогут с реализацией. Мне не нужно использовать пружину для этой конкретной проблемы, я просто реализую ее со всем остальным.

В моем слое DAO я хочу, чтобы мои sql-файлы выводились на экраны по 1 sql на файл. Я хочу прочитать и кешировать SQL-оператор даже, возможно, как синглтон. Но в моей первоначальной борьбе у меня возникла проблема просто загрузить файл sql в classpath...

Есть ли что-нибудь, чтобы помочь с этим? Я просмотрел документацию, но ничего не выпрыгнуло на меня.

Вот то, что мне нужно... но я не могу заставить его распознать файл или, возможно, путь к классу... не совсем уверен, нужно ли что-то определять в applicationContext?

Вот пара попыток, которые, похоже, не работают... и весенние, и просто 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")));

Какие-нибудь мысли?

3 ответа

Решение

Попробуйте заставить Spring внедрить его, предполагая, что вы используете Spring как инфраструктуру внедрения зависимостей.

В вашем классе сделайте что-то вроде этого:

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

А затем в файле контекста приложения, в определении компонента, просто установите свойство:

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

И Spring должен быть достаточно умным, чтобы загрузить файл из classpath и передать его вашему бину в качестве ресурса.

Вы также можете заглянуть в PropertyPlaceholderConfigurer и сохранить весь свой SQL в файлах свойств и просто ввести каждый из них отдельно, где это необходимо. Есть много вариантов.

Изменить. в / в качестве разделителя пути и использовать getResourceAsStream:

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

или же

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

Обратите внимание на косую черту при использовании Class.getResourceAsStream() против ClassLoader.getResourceAsStream,getSystemResourceAsStream использует системный загрузчик классов, который не тот, который вы хотите.

Я подозреваю, что использование косой черты вместо точек будет работать для ClassPathResource тоже.

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`

}
Другие вопросы по тегам