Подтвердить что ты не робот

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

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

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

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

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

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

Любые мысли?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

Изменить. в/в качестве разделителя путей и используйте 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() vs ClassLoader.getResourceAsStream. getSystemResourceAsStream использует системный загрузчик классов, который не является тем, что вы хотите.

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

Ответ 3

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`

}