在类路径中读取文件

Gre*_*g J 31 java file-io spring 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")));
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

Jon*_*eet 39

改变.到/作为路径分隔符并使用getResourceAsStream:

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

要么

reader = new BufferedReader(new InputStreamReader(
    getClass().getResourceAsStream(
        "/com/company/app/dao/sql/SqlQueryFile.sql")));
Run Code Online (Sandbox Code Playgroud)

注意使用Class.getResourceAsStream()vs 时的前导斜杠ClassLoader.getResourceAsStream. getSystemResourceAsStream使用系统类加载器,这不是你想要的.

我怀疑使用斜线而不是点也会起作用ClassPathResource.


小智 34

尝试让Spring注入它,假设你使用Spring作为依赖注入框架.

在你的班上,做这样的事情:

public void setSqlResource(Resource sqlResource) {
    this.sqlResource = sqlResource;
}
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序上下文文件中,在bean定义中,只需设置一个属性:

<bean id="someBean" class="...">
    <property name="sqlResource" value="classpath:com/somecompany/sql/sql.txt" />
</bean>
Run Code Online (Sandbox Code Playgroud)

Spring应该足够聪明,可以从类路径加载文件并将其作为资源提供给bean.

您还可以查看PropertyPlaceholderConfigurer,并将所有SQL存储在属性文件中,并在需要时单独注入每个SQL.有很多选择.