Res / raw dosyasından ada göre nasıl okunur


84

Res / raw / klasöründen bir dosya açmak istiyorum . Dosyanın var olduğundan kesinlikle eminim. Denediğim dosyayı açmak için

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

Komuta

ddd.exists(); 

YANLIŞ sonucunu verir . Yani bu yöntem işe yaramıyor.

Denemek

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

getMessage () "null" ile bir istisna ile sonuçlanır.

Sadece kullanarak

R.raw.example

bu mümkün değildir çünkü dosya adı yalnızca çalışma sırasında bir dize olarak bilinir.

/ Res / raw / klasöründeki bir dosyaya erişmek neden bu kadar zor?



Neden yalnızca çalışma zamanında bir dizge olarak biliniyor? Dizeler ve kimlikler arasında bir eşleştirme tutabilir misiniz?
— kabuko


Bağlantılar için teşekkürler. Ayrı bir cevap olarak doğru bir çözüm vereceğim.
— Bernd

Yanıtlar:


150

Verilen bağlantıların yardımıyla sorunu kendim çözebildim. Doğru yol, kaynak kimliğini almaktır.

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

Giriş Akışı olarak almak için

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

16
Sadece netleştirmek için: Do not başa ekleyerek raw/dosya adı. Geçerli örnek: .getIdentifier("products","raw", getPackageName());içinres/raw/products.json
— JJD

4
JJD tarafından belirtildiği gibi, ham / FILENAME_WITHOUT_EXTENSION öncesinde ihtiyacınız yoktur. Uzantıyı kullanmak isterseniz, örneğin abc.jpg ve abc.zip olmak üzere iki dosyam var, her ikisini de ham klasöre abc_jpg ve abc_zip olarak ekleyeceğimi (ham klasördeki uzantılar göz ardı edilir) sonra String değişkenini atayacağımı buldum. dosyaadı = abc.jpg veya abc.zip, ardından InputStream ins = getResources (). openRawResource (getResources (). getIdentifier (dosyaadı.replace (".", "_"), "ham", getPackageName ())) kullanın; Umarım bu birine yardımcı olur :)
— Bruce

açtığınız yayınları kapatmayı unutmayın
— Pierre

dosya yoluna ihtiyacım var ... bunu girdi akışı yerine nasıl alabilirim?
— Rafael Lima

44

İşte ham klasörden XML dosyası alma örneği:

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

O zaman yapabilirsin:

 String sxml = readTextFile(XmlFileInputStream);

ne zaman:

 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
Sorun şu ki, R.raw.XYZ'yi kullanamıyorum çünkü XYZ adı sadece bir dizge olarak mevcut. Ama simon bağlantısı sorunu çözmeme yardımcı oluyor. Ayrı bir cevap olarak doğru bir çözüm vereceğim.
— Bernd

3
bu mükemmel çalışıyorInputStream input = Context.getResources().openRawResource(R.raw.configjson);
— Someone Somewhere

13

Dosyaları raw / res kullanarak okuyabilirsiniz getResources().openRawResource(R.raw.myfilename).

ANCAK, kullandığınız dosya adının yalnızca küçük harf alfanümerik karakterler ve nokta içerebileceğine dair bir IDE sınırlaması vardır. Dolayısıyla , R gibi XYZ.txtveya my_data.binR'de listelenmeyecek dosya adları .


9
kaynak dosya adlarında da alt çizgiye izin verilir
— laalto

3
Ayrıca sayılara da izin verilir (ilk karakter olarak değil).
— Phantômaxx

İlk karakter olarak değil ... çünkü bu geçerli bir Java değişkeni tanımlayıcısı
— olmayacak

1

İşte, Kotlin'i kullanarak ham kaynakları okuyabileceğiniz iki yaklaşım.

Kaynak kimliğini alarak elde edebilirsiniz. Veya, dosya adını programlı olarak artırarak değiştirebileceğiniz dize tanımlayıcısını kullanabilirsiniz.

Şerefe dostum 🎉

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.