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.