복붙노트

[SPRING] 클래스 패스에서 파일 읽기

SPRING

클래스 패스에서 파일 읽기

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

내 DAO 계층에서 파일 당 1 SQL을 일컬어 내 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")));

이견있는 사람?

해결법

  1. ==============================

    1.Spring이 의존성 주입 프레임 워크로 사용된다고 가정 할 때, Spring이 그것을 삽입하도록 시도하십시오.

    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은 classpath에서 파일을로드하고 리소스로 빈에 제공 할만큼 충분히 영리해야합니다.

    PropertyPlaceholderConfigurer를 살펴보고 모든 SQL을 특성 파일에 저장하고 필요할 때마다 각각을 별도로 주입 할 수 있습니다. 다양한 옵션이 있습니다.

  2. ==============================

    2.변경하십시오. to /를 경로 분리 자로 사용하고 getResourceAsStream을 사용하십시오.

    변경하십시오. to /를 경로 분리 자로 사용하고 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. ==============================

    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`
    
    }
    
  4. from https://stackoverflow.com/questions/734671/read-file-in-classpath by cc-by-sa and MIT license