2012-05-04 49 views
6

thể trùng lặp:
Java resource as fileBao gồm một tập tin văn bản bên trong một file jar và đọc nó

tôi loại mới để Java và tôi đang cố gắng để có được một tập tin văn bản bên trong một Jar tệp.

Hiện tại khi tôi thực hiện jar của mình, tôi phải có tệp văn bản trong cùng thư mục với tệp jar. Nếu tập tin văn bản không có ở đó tôi sẽ nhận được một NullPointerException, mà tôi muốn tránh.

Điều tôi muốn làm là lấy tệp txt bên trong bình để tôi không gặp vấn đề này. Tôi đã thử một số hướng dẫn nhưng chúng dường như không hoạt động. Chức năng đọc hiện tại của tôi giống như sau:

public static HashSet<String> readDictionary() 
{ 
    HashSet<String> toRet = new HashSet<>(); 
    try 
    { 
      // Open the file that is the first 
      // command line parameter 
      FileInputStream fstream = new FileInputStream("Dictionary.txt"); 
     try (DataInputStream in = new DataInputStream(fstream)) { 
      BufferedReader br = new BufferedReader(new InputStreamReader(in)); 
      String strLine; 
      //Read File Line By Line 
      while ((strLine = br.readLine()) != null) { 
      // Read Lines 
       toRet.add(strLine); 
      } 
     } 
      return toRet; 
    } 
    catch (Exception e) 
    {//Catch exception if any 
      System.err.println("Error: " + e.getMessage()); 
    } 
    return null; 
} 

Trả lời

7

Đừng cố gắng tìm tệp dưới dạng "tệp" trong tệp Jar. Sử dụng tài nguyên để thay thế.

Lấy tham chiếu đến lớp hoặc trình tải lớp và sau đó trên lớp hoặc trình tải lớp gọi getResourceAsStream(/* resource address */);.

Bạn cũng nên làm việc trên các kỹ năng tìm kiếm của mình, vì điều này đã được hỏi và trả lời ở đây vô số lần. Trong thực tế, chúng tôi có lẽ nên đóng câu hỏi này vì tôi không nhìn thấy nó thêm vào các cuộc thảo luận đã có mặt trên SO.

2

Có vẻ như một bản sao chính xác của câu hỏi này: How do I access a config file inside the jar?

Tiếp tục cho vấn đề của bạn với NullPointerException, tôi đề nghị không để chắc chắn rằng nó không xảy ra, mà đúng hơn là chuẩn bị cho nó và xử lý nó đúng cách. Tôi muốn đi xa hơn nữa để yêu cầu bạn luôn luôn kiểm tra các biến của bạn với giá trị null, đó là một việc tốt để làm.

3
// add a leading slash to indicate 'search from the root of the class-path' 
URL urlToDictionary = this.getClass().getResource("/" + "Dictionary.txt"); 
InputStream stream = urlToDictionary.openStream(); 

Xem thêm this answer.

Các vấn đề liên quan