2009-04-09 40 views
31

Đây là những gì tôi muốn làm và tôi tự hỏi nếu có bất kỳ lớp học mùa xuân sẽ giúp thực hiện. Tôi không phải sử dụng mùa xuân cho vấn đề cụ thể này, tôi chỉ thực hiện nó với mọi thứ khác.đọc tập tin trong classpath

Trong lớp DAO của tôi, tôi muốn mở rộng tệp sql của tôi, còn được gọi là 1 sql cho mỗi tệp. Tôi muốn đọc và lưu trữ câu lệnh sql thậm chí có thể là một singleton bean mùa xuân. Nhưng trong cuộc đấu tranh ban đầu của tôi, tôi đang gặp sự cố khi tải một tệp sql trong đường dẫn lớp ...

Có điều gì vào mùa xuân để trợ giúp không? Tôi đã được thông qua các tài liệu hướng dẫn nhưng không có gì là nhảy ra ngoài với tôi.

Đây là những gì tôi đang theo sau .. nhưng tôi không thể làm cho nó nhận ra các tập tin hoặc có thể là classpath ... không thực sự chắc chắn làm một cái gì đó cần phải được định nghĩa trong applicationContext?

Dưới đây là một vài nỗ lực dường như không hoạt động ... cả spring'ish và 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"))); 

Bạn nghĩ gì?

Trả lời

34

Hãy thử nhận Spring để tiêm nó, giả sử bạn đang sử dụng Spring làm khung tiêm phụ thuộc.

Trong lớp học của bạn, đừng cái gì đó như thế này:

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

Và sau đó trong tập tin bối cảnh ứng dụng của bạn, trong định nghĩa bean, chỉ cần thiết lập một tài sản:

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

Và mùa xuân nên thông minh đủ để tải lên tệp từ classpath và đưa nó cho bean của bạn như là một tài nguyên.

Bạn cũng có thể xem xét PropertyPlaceholderConfigurer và lưu trữ tất cả các tệp SQL của bạn trong tệp thuộc tính và chỉ cần tiêm từng tệp một cách riêng biệt khi cần. Có rất nhiều lựa chọn.

+1

Cảm ơn bạn, đây là những gì tôi đã làm sau. Tôi khá mới đến mùa xuân và điều này dường như làm việc độc đáo. Thật không may tôi đã có câu hỏi này được đăng trên diễn đàn mùa xuân và không có phản ứng ... +1 để stackoverfow. –

+0

Câu trả lời hay! Tài nguyên đó có phải là org.springframework.core.io.Resource không? – fastcodejava

39

Thay đổi. đến/để tách các đường dẫn và sử dụng getResourceAsStream:

reader = new BufferedReader(new InputStreamReader(
    getClass().getClassLoader().getResourceAsStream(
     "com/company/app/dao/sql/SqlQueryFile.sql"))); 

hoặc

reader = new BufferedReader(new InputStreamReader(
    getClass().getResourceAsStream(
     "/com/company/app/dao/sql/SqlQueryFile.sql"))); 

Lưu ý dấu gạch chéo hàng đầu khi sử dụng Class.getResourceAsStream() vs ClassLoader.getResourceAsStream. getSystemResourceAsStream sử dụng hệ thống trình nạp lớp không phải là thứ bạn muốn.

Tôi cho rằng việc sử dụng dấu gạch chéo thay vì dấu chấm cũng sẽ hoạt động đối với ClassPathResource.

+0

Hãy cẩn thận với hàng đầu /. Nếu mã trên được truy cập từ một lớp trong gói com.company.app.dao.sql, bạn thực sự chỉ muốn SqlQueryFile.sql ở đó. Nếu mã được truy cập từ một gói khác, bạn cần một hàng đầu/ –

+0

oh đợi một giây - bạn thực sự muốn getClass(). GetClassLoader(). GetResourceAsStream() - nó không tĩnh –

+0

Tôi đã thông báo bạn cần getClass() nhưng vì một số lý do nó không hoạt động. Tôi chắc chắn nó thực sự gần gũi. Có vẻ như nó sẽ hoạt động. Câu trả lời mùa xuân tôi nhận được là những gì tôi đang theo sau vì vậy tôi sẽ không theo đuổi điều này nữa. Cảm ơn tất cả các bạn đã giúp đỡ! –

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` 

}