2013-04-09 24 views
50

Tôi muốn mở tệp từ thư mục res/raw/. Tôi hoàn toàn chắc chắn rằng tệp tồn tại. Để mở file tôi đã cố gắngCách đọc tệp từ res/raw theo tên

File ddd = new File("res/raw/example.png"); 

Lệnh

ddd.exists(); 

mang FALSE. Vì vậy, phương pháp này không hoạt động.

Cố

MyContext.getAssets().open("example.png"); 

kết thúc trong một ngoại lệ với getMessage() "null".

Đơn giản chỉ cần sử dụng

R.raw.example 

là không thể vì tên tập tin chỉ được biết đến trong thời gian chạy như là một chuỗi.

Tại sao việc truy cập tệp trong thư mục/res/raw /?

+0

bản sao có thể có của [Tải tài nguyên động Android] (http://stackoverflow.com/questions/3648942/dynamic-resource-loading-android) – Simon

+0

Tại sao nó chỉ được biết trong thời gian chạy như một chuỗi? Bạn có thể giữ một ánh xạ giữa các chuỗi và các ID không? – kabuko

+0

Đọc tài liệu: http://developer.android.com/guide/topics/resources/providing-resources.html – dmon

Trả lời

92

Với sự giúp đỡ của các liên kết cho tôi đã có thể tự giải quyết vấn đề. Cách đúng là để có được ID tài nguyên với

getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION", 
          "raw", getPackageName()); 

Để có được nó như là một InputStream

InputStream ins = getResources().openRawResource(
      getResources().getIdentifier("FILENAME_WITHOUT_EXTENSION", 
      "raw", getPackageName())); 
+13

Chỉ cần làm rõ: Do ** not ** prepend 'raw /' cho tên tệp. Ví dụ hợp lệ: '.getIdentifier (" products "," raw ", getPackageName());' cho 'res/raw/products.json' – JJD

+4

Như đã nêu trong JJD, bạn không cần dữ liệu thô/trước FILENAME_WITHOUT_EXTENSION. Tôi thấy rằng nếu bạn muốn sử dụng phần mở rộng, ví dụ tôi có hai tệp abc.jpg và abc.zip, tôi sẽ thêm cả hai vào thư mục thô dưới dạng abc_jpg và abc_zip (phần mở rộng trong thư mục thô bị bỏ qua), sau đó gán biến Chuỗi filename = abc.jpg hoặc abc.zip, sau đó sử dụng InputStream ins = getResources(). openRawResource (getResources(). getIdentifier (filename.replace (".", "_"), "raw", getPackageName())); Hy vọng điều này sẽ giúp ai đó :) – Bruce

+0

nhớ đóng mọi luồng bạn mở – Pierre

29

Dưới đây là ví dụ về việc tập tin XML từ folder liệu:

InputStream XmlFileInputStream = getResources().openRawResource(R.raw.taskslists5items); // getting XML 

Sau đó, bạn có thể:

String sxml = readTextFile(XmlFileInputStream); 

khi:

public String readTextFile(InputStream inputStream) { 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 

     byte buf[] = new byte[1024]; 
     int len; 
     try { 
      while ((len = inputStream.read(buf)) != -1) { 
       outputStream.write(buf, 0, len); 
      } 
      outputStream.close(); 
      inputStream.close(); 
     } catch (IOException e) { 

     } 
     return outputStream.toString(); 
    } 
+1

Vấn đề là tôi không thể sử dụng R.raw.XYZ vì tên của XYZ chỉ có sẵn dưới dạng một chuỗi. Nhưng liên kết của simon giúp tôi giải quyết vấn đề. Tôi sẽ đưa ra một giải pháp đúng như một câu trả lời riêng biệt. –

+3

hoạt động này hoàn toàn tốt 'InputStream input = Context.getResources(). OpenRawResource (R.raw.configjson);' –

8

Bạn có thể đọc các file trong/res liệu sử dụng getResources().openRawResource(R.raw.myfilename).

NHƯNG có giới hạn IDE rằng tên tệp bạn sử dụng chỉ có thể chứa ký tự chữ và số chữ thường và dấu chấm. Vì vậy, tên tệp như XYZ.txt hoặc my_data.bin sẽ không được liệt kê trong R.

+8

gạch dưới cũng được cho phép trong tên tệp tài nguyên – laalto

+2

Số khác cũng được phép (không phải là ký tự đầu tiên). –

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