Читать файл в classpath
Вот что я хочу сделать, и мне интересно, есть ли классы Spring, которые помогут с реализацией. Мне не нужно использовать пружину для этой конкретной проблемы, я просто реализую ее со всем остальным.
В моем слое DAO я хочу, чтобы мои sql-файлы выводились на экраны по 1 sql на файл. Я хочу прочитать и кешировать SQL-оператор даже, возможно, как синглтон. Но в моей первоначальной борьбе у меня возникла проблема просто загрузить файл sql в classpath...
Есть ли что-нибудь, чтобы помочь с этим? Я просмотрел документацию, но ничего не выпрыгнуло на меня.
Вот то, что мне нужно... но я не могу заставить его распознать файл или, возможно, путь к классу... не совсем уверен, нужно ли что-то определять в 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")));
Какие-нибудь мысли?
3 ответа
Попробуйте заставить Spring внедрить его, предполагая, что вы используете Spring как инфраструктуру внедрения зависимостей.
В вашем классе сделайте что-то вроде этого:
public void setSqlResource(Resource sqlResource) {
this.sqlResource = sqlResource;
}
А затем в файле контекста приложения, в определении компонента, просто установите свойство:
<bean id="someBean" class="...">
<property name="sqlResource" value="classpath:com/somecompany/sql/sql.txt" />
</bean>
И Spring должен быть достаточно умным, чтобы загрузить файл из classpath и передать его вашему бину в качестве ресурса.
Вы также можете заглянуть в PropertyPlaceholderConfigurer и сохранить весь свой SQL в файлах свойств и просто ввести каждый из них отдельно, где это необходимо. Есть много вариантов.
Изменить. в / в качестве разделителя пути и использовать 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()
против ClassLoader.getResourceAsStream
,getSystemResourceAsStream
использует системный загрузчик классов, который не тот, который вы хотите.
Я подозреваю, что использование косой черты вместо точек будет работать для ClassPathResource
тоже.
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`
}