2009-04-09 19 views
31

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.leer el archivo en classpath

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.

Esto es lo que busco ... pero no logro reconocer el archivo o tal vez el classpath ... ¿no estoy seguro de que algo tiene que definirse en applicationContext?

Aquí hay un par de intentos que no parecen 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?

Respuesta

34

Intente obtener Spring para inyectarlo, suponiendo que está utilizando Spring como un marco de inyección de dependencia.

En su clase, hacer algo como esto:

public void setSqlResource(Resource sqlResource) { 
    this.sqlResource = sqlResource; 
} 

Y luego en el archivo de contexto de aplicación, en la definición de frijol, acaba de establecer una propiedad:

<bean id="someBean" class="..."> 
    <property name="sqlResource" value="classpath:com/somecompany/sql/sql.txt" /> 
</bean> 

Y Resorte debe ser inteligente lo suficiente como para cargar el archivo de la ruta de clases y dársela a su bean como recurso.

También puede consultar PropertyPlaceholderConfigurer, y almacenar todos sus SQL en archivos de propiedades y simplemente inyectarlos por separado cuando sea necesario. Hay muchas opciones.

+1

Gracias, esto es lo que estaba buscando. Soy bastante nuevo en la primavera y parece que funciona bien. Lamentablemente tuve la misma pregunta publicada en el foro de primavera y no obtuve ninguna respuesta ... +1 a stackoverfow. –

+0

¡Buena respuesta! ¿Es ese recurso org.springframework.core.io.Resource? – fastcodejava

39

Cambio. a/como separador de ruta y utilizar 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"))); 

Nota de la barra inicial cuando se utiliza Class.getResourceAsStream() vs ClassLoader.getResourceAsStream. getSystemResourceAsStream utiliza el sistema classloader que no es lo que desea.

Sospecho que usar barras en lugar de puntos también funcionaría para ClassPathResource.

+0

Tenga cuidado con el principio /. Si se accede al código anterior desde una clase en el paquete com.company.app.dao.sql, realmente solo desea que SqlQueryFile.sql esté allí. Si se accede al código desde otro paquete, necesita un/ –

+0

líder; espere un segundo; realmente quiere getClass(). GetClassLoader(). GetResourceAsStream() - no es estático –

+0

Me di cuenta de que necesitaba el getClass() pero por alguna razón, no funcionó. Estoy seguro de que está muy cerca sin embargo. Parece que debería funcionar. La respuesta de Spring que recibí es lo que busco, así que ya no seguiré con esta. ¡Gracias a todos por la ayuda! –

0
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` 

}