2012-11-06 37 views
6

Tôi đang cố gắng đọc một tập tin văn bản từ kho lưu trữ chiến tranh của mình và hiển thị nội dung trong trang bảng tính khi chạy. cấu trúc thư mục của tôi là như sauĐọc một tập tin văn bản trong kho lưu trữ chiến tranh

+ lưu trữ chiến tranh> + nguồn> + email> + file.txt

Tôi cố gắng đọc các tập tin trong các tài nguyên/thư mục email/file.txt sử dụng đoạn mã sau

File file = new File("/resources/email/file.txt"); 
BufferedReader reader = null; 
try { 
    reader = new BufferedReader(new FileReader(file)); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
StringBuffer buffer = new StringBuffer(); 
if (reader != null) { 
    String line = reader.readLine(); 
    while (line != null) { 
     buffer.append(line); 
     line = reader.readLine(); 
// other lines of code 

Tuy nhiên, vấn đề là khi tôi phương pháp với mã ở trên chạy, A FileNotFoundException bị ném. Tôi cũng đã thử sử dụng dòng mã sau để lấy tệp nhưng chưa thành công

File file = new File(FacesContext.getCurrentInstance() 
     .getExternalContext().getRequestContextPath() + "/resources/email/file.txt"); 

Tôi vẫn nhận được FileNotFoundException. Làm thế nào là điều này gây ra và làm thế nào tôi có thể giải quyết nó?

Trả lời

17

Hãy thử dưới đây:

InputStream inputStream = 
     getClass().getClassLoader().getResourceAsStream("/resources/email/file.txt"); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
8

Cố gắng tránh tệp, vì điều này là để đọc những thứ từ hệ thống tệp.

Khi tài nguyên của bạn được nhóm vào WAR, bạn có thể truy cập nó thông qua trình nạp lớp.

Đảm bảo rằng tài nguyên được nhóm vào thư mục WEB-INF/classes của bạn.

InputStream in = 
new InputStreamReader(FileLoader.class.getClassLoader().getResourceAsStream("/resources/email/file.txt")); 

Đây là một blog tốt về chủ đề này

http://haveacafe.wordpress.com/2008/10/19/how-to-read-a-file-from-jar-and-war-files-java-and-webapp-archive/

+2

Đại diện ba nhân vật hạnh phúc. :) –

+1

Cảm ơn. Một câu hỏi một ngày là tất cả phải mất. – Tinman

+0

Tôi đã thử với ví dụ trên, tôi có tệp được liệt kê trong cấu trúc thư mục sau /WEBINF/classes/resources/file.txt. Tuy nhiên tôi vẫn nhận được ngoại lệ sau Gây ra bởi: java.lang.NullPointerException tại java.io.Reader. (Nguồn không xác định) [rt.jar: 1.7.0_04] tại java.io.InputStreamReader. (Nguồn không xác định) [rt.jar: 1.7.0_04] tại org.xanosms.emailsender.RegistrationEmailLoader.loadFile (RegistrationEmailLoader.java:43) [classes:] –

3

Nếu bạn muốn để có được những đối tượng java File, bạn có thể thử này:

String path = Thread.currentThread().getContextClassLoader().getResource("language/file.xml").getPath(); 
File f = new File(path); 
System.out.println(f.getAbsolutePath()); 
1

tôi thích phương pháp này:

InputStream inputStream = getClass().getResourceAsStream("/resources/email/file.txt"); 

if (inputStream != null) { 
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { 
     ... 
    } catch ... 
} else ... 

Ba lý do:

  • nó hỗ trợ cả hai: nguồn lực tải từ một đường dẫn tuyệt đối và từ một đường dẫn tương đối (bắt đầu từ lớp nhất định) - xem thêm this answer
  • cách lấy luồng là một bước ngắn hơn
  • nó sử dụng câu lệnh try-with-resources để đóng hoàn toàn luồng đầu vào cơ bản
+0

Điều gì khác ở đây so với câu trả lời được chấp nhận với 9 upvotes ....? – Kukeltje

+0

@Kukeltje: Vui lòng xem chỉnh sửa của tôi –

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