在类路径中读取文件

时间:2009-04-09 15:13:23

标签: java spring file-io classpath

这就是我想要做的事情,我想知道是否有任何Spring类可以帮助实现。我没有必要使用spring来解决这个问题,我只是用其他一切来实现它。

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

春天有什么可以帮助的吗?我一直在阅读文档,但没有任何内容正在向我发出。

这是我正在追求的东西..但是我无法识别文件或类似路径...不确定是否需要在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")));

有什么想法吗?

2 个答案:

答案 0 :(得分: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.getResourceAsStream时的前导斜杠。 getSystemResourceAsStream使用的系统类加载器不是您想要的。

我怀疑使用斜杠而不是点也适用于ClassPathResource

答案 1 :(得分: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。有很多选择。