32

这是我想做的,我想知道是否有任何 Spring 类可以帮助实现。对于这个特殊问题,我不必使用 spring,我只是用其他所有东西来实现它。

在我的 DAO 层中,我想外部化我的 sql 文件,也就是每个文件 1 个 sql。我想读取和缓存 sql 语句,甚至可能作为一个 spring bean 单例。但在我最初的挣扎中,我在类路径中加载一个 sql 文件时遇到了问题......

春天有什么可以帮助的吗?我已经阅读了文档,但没有任何事情发生在我身上。

这是我所追求的……但我无法让它识别文件或类路径……不确定是否需要在 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")));

有什么想法吗?

4

3 回答 3

39

改变 。以 / 作为路径分隔符并使用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.getResourceAsStreamgetSystemResourceAsStream使用不是您想要的系统类加载器。

我怀疑使用斜线而不是点也可以ClassPathResource

于 2009-04-09T15:14:47.440 回答
34

假设您使用 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 存储在属性文件中,并在需要时单独注入每个 SQL。有很多选择。

于 2009-04-09T15:17:50.853 回答
0
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`

}
于 2015-07-15T15:49:45.253 回答