java - read - leer archivo en classpath
leer archivo properties java web (3)
Cambio . a / como el separador de ruta y use getResourceAsStream
:
reader = new BufferedReader(new InputStreamReader(
getClass().getClassLoader().getResourceAsStream(
"com/company/app/dao/sql/SqlQueryFile.sql")));
o
reader = new BufferedReader(new InputStreamReader(
getClass().getResourceAsStream(
"/com/company/app/dao/sql/SqlQueryFile.sql")));
Tenga en cuenta la barra diagonal al usar Class.getResourceAsStream()
vs ClassLoader.getResourceAsStream
. getSystemResourceAsStream
usa el cargador de clases del sistema que no es lo que quieres.
Sospecho que usar barras oblicuas en lugar de puntos también funcionaría para ClassPathResource
.
Esto es lo que quiero hacer y me pregunto si hay alguna clase de Spring que ayude con la implementación. No tengo que usar la primavera para este problema en particular, solo lo estoy implementando con todo lo demás.
En mi capa DAO quiero externalizar mis archivos sql también conocidos como 1 sql por archivo. Quiero leer y guardar en caché el enunciado sql incluso tal vez como singleton de bean de primavera. Pero en mis dificultades iniciales, estoy teniendo un problema simplemente cargando un archivo sql en el classpath ...
¿Hay algo en la primavera para ayudar con eso? He revisado la documentación, pero nada me está saltando.
He aquí algo de lo que busco ... pero no consigo que reconozca el archivo o tal vez el classpath ... ¿no estoy seguro de que algo debe definirse en applicationContext?
Aquí hay un par de intentos que parecen no funcionar ... tanto en primavera como en java.
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")));
¿Alguna idea?
Intente que Spring lo inyecte, suponiendo que esté utilizando Spring como un marco de inyección de dependencia.
En tu clase, haz algo como esto:
public void setSqlResource(Resource sqlResource) {
this.sqlResource = sqlResource;
}
Y luego, en el archivo de contexto de la aplicación, en la definición de bean, solo establece una propiedad:
<bean id="someBean" class="...">
<property name="sqlResource" value="classpath:com/somecompany/sql/sql.txt" />
</bean>
Y Spring debería ser lo suficientemente inteligente como para cargar el archivo desde el classpath y dárselo a su bean como recurso.
También puede consultar PropertyPlaceholderConfigurer y almacenar todo su SQL en archivos de propiedades e inyectarlos por separado donde sea necesario. Hay muchas opciones.
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`
}