读取类路径中的文件

2022-09-01 08:13:34

这是我想做的,我想知道是否有任何Spring课程可以帮助实现。我不必使用弹簧来解决这个特定的问题,我只是用其他所有东西来实现它。

在我的DAO层中,我想外部化我的sql文件,即每个文件1 sql。我想读取和缓存sql语句,甚至可能作为弹簧豆单例。但是在我最初的挣扎中,我在类路径中加载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")));

有什么想法吗?


答案 1

改变。to / 作为路径分隔符并使用: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")));

使用 vs 时,请注意前导斜杠。 使用系统类装入器,这不是你想要的。Class.getResourceAsStream()ClassLoader.getResourceAsStreamgetSystemResourceAsStream

我怀疑使用斜杠而不是点也会起作用。ClassPathResource


答案 2

尝试让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。有很多选择。