2009-04-09 2 views
31

Вот что я хочу сделать, и мне интересно, есть ли какие-либо классы Spring, которые помогут в реализации. Мне не нужно использовать весну для этой конкретной проблемы, я просто реализую ее со всем остальным.читать файл в пути к классам

В моем слое DAO я хочу экрнализировать свои sql-файлы aka 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"))); 

Любые мысли?

ответ

34

Попробуйте получить 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> 

И весна должна быть умным достаточно, чтобы загрузить файл из пути к классам и передать его вашему компоненту в качестве ресурса.

Вы также можете изучить PropertyPlaceholderConfigurer и хранить все свои файлы SQL в файлах свойств и просто вводить каждый отдельно, если необходимо. Есть много вариантов.

+1

Спасибо, это то, что я был после. Я довольно новичок в весне, и это, похоже, работает красиво. К сожалению, у меня был такой же вопрос, который был размещен на весеннем форуме и не получил ответов ... +1 в stackoverfow. –

+0

Хороший ответ! Это ресурс org.springframework.core.io.Resource? – fastcodejava

39

Изменить. в/в качестве разделителя пути и использовать 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 использует систему classloader, которая не является тем, что вы хотите.

Я подозреваю, что использование косых черт вместо точек будет работать и для ClassPathResource.

+0

Будьте осторожны с ведущими /. Если вышеприведенный код доступен из класса в пакете com.company.app.dao.sql, вы действительно просто хотите SqlQueryFile.sql. Если код доступен из другого пакета, вам нужен ведущий/ –

+0

oh wait a sec - вы действительно хотите getClass(). GetClassLoader(). GetResourceAsStream() - он не статический –

+0

Я заметил, что вам нужен getClass(), но по какой-то причине это не сработало. Я уверен, что это действительно близко. Похоже, он должен работать. Весенний ответ, который я получил, - это то, что мне нужно, поэтому я больше не буду заниматься этим. Спасибо всем за помощь! –

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` 

} 
Смежные вопросы