Читать файл в classpath
Вот что я хочу сделать, и мне интересно, есть ли классы Spring, которые помогут в реализации. Мне не нужно использовать Spring для этой конкретной проблемы, я просто реализую ее со всем остальным.
В моем слое DAO я хочу экрнализировать мои файлы sql aka 1 sql на файл. Я хочу читать и кэшировать оператор sql, даже, возможно, в качестве синтаксиса Spring bean. Но в моей первоначальной борьбе у меня возникла проблема просто загрузить файл sql в путь к классам...
Есть ли что-нибудь в Spring, чтобы помочь с этим? Я прошел через документацию, но ничего не выпрыгивает на меня.
Вот что я потом... но я не могу заставить его распознать файл или, может быть, classpath... не уверен, что что-то нужно определять в 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")));
Любые мысли?
Ответы
Ответ 1
Попробуйте получить 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 и просто вводить их отдельно, если необходимо. Есть много вариантов.
Ответ 2
Изменить. в/в качестве разделителя путей и используйте 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
.
Ответ 3
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`
}