Cách đọc tệp từ res / raw theo tên


82

Tôi muốn mở một 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ở tệp tôi đã thử

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

Lệnh

ddd.exists(); 

cho kết quả SAI . Vì vậy, phương pháp này không hoạt động.

Cố gắng

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 chỉ được biết trong thời gian chạy dưới dạng một chuỗi.

Tại sao rất khó truy cập một tệp trong thư mục / res / raw /?


Bản sao có thể xảy ra với Android Đang tải tài nguyên động
Simon

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


Cảm ơn bạn đã liên kết. Tôi sẽ đưa ra một giải pháp chính xác như một câu trả lời riêng biệt.
Bernd

Câu trả lời:


147

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

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

Để lấy nó dưới dạng InputStream

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

15
Chỉ cần làm rõ: Đỗ không thêm vào trước raw/cho tên tập tin. Ví dụ hợp lệ: .getIdentifier("products","raw", getPackageName());chores/raw/products.json
JJD,

4
Như đã nêu bởi JJD, bạn không cần tệp thô / trước FILENAME_WITHOUT_EXTENSION. Tôi thấy rằng nếu bạn muốn sử dụng tiện ích mở rộng, chẳng hạn như tôi có hai tệp abc.jpg và abc.zip, tôi sẽ thêm cả hai tệp đó vào thư mục thô dưới dạng abc_jpg và abc_zip (các 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 người :)
Bruce

nhớ đóng bất kỳ luồng nào bạn mở
Pierre

tôi cần đường dẫn tệp ... làm cách nào tôi có thể lấy nó thay vì dòng đầu vào?
Rafael Lima

44

Đây là ví dụ về việc lấy tệp XML từ thư mục thô:

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

Sau đó bạn có thể:

 String sxml = readTextFile(XmlFileInputStream);

khi nào:

 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 chính xác như một câu trả lời riêng biệt.
Bernd

3
này hoạt động hoàn toàn tốt đẹpInputStream input = Context.getResources().openRawResource(R.raw.configjson);
Có người Một nơi nào đó

13

Bạn có thể đọc tệp ở dạng thô / res bằng cách sử dụng getResources().openRawResource(R.raw.myfilename).

NHƯNG có một hạn chế của IDE là tên tệp bạn sử dụng chỉ có thể chứa các ký tự chữ và số viết thường và dấu chấm. Vì vậy, tên tệp giống như XYZ.txthoặc my_data.binsẽ không được liệt kê trong R.


9
gạch cũng được cho phép trong tên tập tin tài nguyên
laalto

3
Cũng cho phép các số (không phải là ký tự đầu tiên).
Phantômaxx

Không phải là ký tự đầu tiên ... vì đó sẽ không phải là một biến dạng Java hợp lệ
peterchaula

1

Đây là hai cách tiếp cận bạn có thể đọc các tài nguyên thô bằng Kotlin.

Bạn có thể lấy nó bằng cách lấy id tài nguyên. Hoặc, bạn có thể sử dụng mã định danh chuỗi trong đó bạn có thể lập trình thay đổi tên tệp với mức tăng dần.

Chúc mừng bạn đời 🎉

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.