2009-04-09 2 views
31

여기에 내가하고 싶은 것이 있습니다. 구현에 도움이 될 Spring 클래스가 있는지 궁금합니다. 나는이 특별한 문제에 대해 봄을 사용할 필요가 없다. 나는 다른 모든 것을 구현하고있다.클래스 패스에있는 파일 읽기

내 DAO 계층에서 파일 당 일일 SQL을 외부화하려고합니다. 나는 봄 콩 싱글 톤 (singleton)처럼 SQL 문장을 읽고 캐시하고 싶다. 그러나 초기의 어려움에서 클래스 패스에 SQL 파일을로드하는 데 문제가 있습니다 ...

도움이 될만한 것이 있습니까? 나는 문서를 훑어 보았지만 나에게 뛰어 오르는 것은 아무것도 없었다.

다음은 내가 후에하는 일종의 것입니다. 그러나 파일이나 클래스 패스를 인식 할 수 없습니다. 실제 애플리케이션이 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"))); 

의견이 있으십니까?

답변

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> 

그리고 봄이 영리해야한다 클래스 경로에서 파일을로드하고이를 자원으로 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"))); 

참고 슬래시 ClassLoader.getResourceAsStreamClass.getResourceAsStream() 대를 사용. getSystemResourceAsStream은 사용자가 원하지 않는 시스템 클래스 로더를 사용합니다.

도트 대신 슬래시를 사용하면 ClassPathResource도 작동하는 것으로 판단됩니다.

+0

앞/뒤에주의하십시오. 위의 코드가 com.company.app.dao.sql 패키지의 클래스에서 액세스되는 경우 실제로는 SqlQueryFile.sql 만 필요합니다. 다른 패키지에서 코드에 액세스하는 경우/ –

+0

오 기다리십시오 - 정말 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` 

}