2012-10-22 21 views
7

Tôi có nhiều tệp tài nguyên đi kèm với ứng dụng Java của mình. Những tệp này có tên tệp chứa các ký tự quốc tế như ü hoặc æ. Tôi muốn tải các tệp này bằng cách sử dụng getClass(). GetResource(), nhưng dường như điều này không được hỗ trợ vì các tên tệp cụ thể này, phương thức getResource luôn trả về giá trị rỗng.Thay thế quốc tế tốt nhất cho getClass của Java(). GetResource()

Điều đó làm tôi thử nghiệm bằng cách sử dụng mã hóa URL của các ký tự quốc tế, nhưng điều này không được hỗ trợ hoặc được nêu rõ bởi http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4968789.

Vì vậy, câu hỏi của tôi là: Cách được đề xuất tải nguồn tài nguyên có tên chứa ký tự quốc tế là gì? Ví dụ: tôi cần tải nội dung UTF-8 của một tệp có tên Sjælland.txt

Trả lời

3

Không chắc chắn nếu có một best (có thể là ứng cử viên cho worst vì nó khá là hack) nhưng điều này có vẻ như cơ chế có khả năng. Nó tránh sự cần thiết phải sử dụng getResource bằng cách đọc trực tiếp bình.

public class NavelGazing { 
    public static void main(String[] args) throws Throwable { 
    // Do a little navel gazing. 
    java.net.URL codeBase = NavelGazing.class.getProtectionDomain().getCodeSource().getLocation(); 
    // Must be a jar. 
    if (codeBase.getPath().endsWith(".jar")) { 
     // Open it. 
     java.util.jar.JarInputStream jin = new java.util.jar.JarInputStream(codeBase.openStream()); 
     // Walk the entries. 
     ZipEntry entry; 
     while ((entry = jin.getNextEntry()) != null) { 
     System.out.println("Entry: "+entry.getName()); 
     } 
    } 

    } 
} 

Tôi đã thêm tệp có tên Sjælland.txt và điều này đã nhận được mục nhập thành công.

+0

Điều đó thật thú vị. Tôi có thể thấy lý do tại sao điều đó sẽ hiệu quả. Tuy nhiên, tôi nghĩ rằng nó sẽ mất một số công việc nhiều hơn cho hiệu suất thích hợp, kể từ khi bạn đang mở một lọ nén mỗi khi bạn đọc một tập tin. Trước khi đi xuống con đường đó, tôi sẽ xem liệu có ai khác có lựa chọn thay thế khác để chia sẻ không. –

0

Tôi không chắc chắn rằng tôi hiểu bạn một cách chính xác, nhưng nếu tôi cố gắng

URL url = Test.class.getResource("/Sjælland.txt"); 
Object o = url.getContent(); 

sau đó o là một sun.net.www.content.text.PlainTextInputStream.

Tôi đang sử dụng JDK 1.6 trên máy tính Windows. Tôi đã có (mặc định?) System.property sun.jnu.encoding đặt thành Cp1252. Vì vậy, tất cả dường như làm việc tốt. Lỗi bạn đã đăng có vẻ là JDK 1.4. Nó có thể là những gì bạn đang sử dụng.

+0

Không, tôi đang sử dụng phiên bản Java: 1.7.0_10-ea, nhà cung cấp Java: Tập đoàn Oracle trên máy Mac. Điều này được sử dụng để làm việc tốt với Java 1.6.x từ Apple. Tôi sẽ xem xét mã hóa - có lẽ đó là ... –

+0

Tôi đã thử sử dụng cài đặt sun.jnu.encoding của UTF-8, vì trang này cho biết đó là những gì mac sử dụng: http://developer.apple. com/library/mac/# documentation/Java/khái niệm/Java/# tài liệu/Java/Khái niệm/Java14Development/04-JavaUIToolkits/JavaUIToolkits.html Tôi cũng đã thử sử dụng Trình chuẩn hóa để phân tách tên tệp như là tùy chỉnh trong hệ thống tệp Mac với dòng này: resourceUri = Normalizer.normalize (resourceUri, Normalizer.Form.NFD); Tuy nhiên, nó không hoạt động. –

+0

Nếu tôi tra cứu thư mục và liệt kê các tệp của nó bằng cách sử dụng Java.io tôi tìm thấy tên tệp là Sj lland.txt Giá trị điểm mã là [83, 106, 65533, 65533, 108, 108, 97, 110, 100 , 46, 116, 120, 116] Vì vậy, 'æ' được biểu diễn bằng hai ký tự bằng cách nào đó. –

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