res / rawから名前でファイルを読み取る方法


84

res / raw /フォルダからファイルを開きたい。私はファイルが存在することを絶対に確信しています。私が試したファイルを開くには

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

コマンド

ddd.exists(); 

FALSEを生成します。したがって、この方法は機能しません。

やってみる

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

getMessage() "null"で例外が発生します。

単に使用する

R.raw.example

ファイル名は実行時に文字列としてのみ認識されるため、不可能です。

/ res / raw /フォルダ内のファイルにアクセスするのが非常に難しいのはなぜですか?



実行時に文字列としてのみ認識されるのはなぜですか?文字列とIDの間のマッピングを維持できますか?
歌舞伎2013


リンクありがとうございます。別の答えとして正しい解決策を示します。
Bernd 2013

回答:


150

与えられたリンクの助けを借りて、私は自分で問題を解決することができました。正しい方法は、でリソースIDを取得することです

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

InputStreamとして取得するには

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

16
明確にするために:ファイル名の前に付加しないでくださいraw/。有効な例:.getIdentifier("products","raw", getPackageName());forres/raw/products.json
JJD 2014年

4
JJDが述べているように、FILENAME_WITHOUT_EXTENSIONの前にraw /は必要ありません。拡張子を使用したい場合、たとえばabc.jpgとabc.zipの2つのファイルがある場合は、両方をabc_jpgとabc_zipとしてrawフォルダーに追加し(rawフォルダーの拡張子は無視されます)、String変数を割り当てます。 filename = abc.jpgまたはabc.zipの場合は、InputStream ins = getResources()。openRawResource(getResources()。getIdentifier(filename.replace( "。"、 "_")、 "raw"、getPackageName()));を使用します。これが誰かに役立つことを願っています:)
ブルース

開いたストリームはすべて閉じることを忘れないでください
Pierre

ファイルパスが必要です...入力ストリームの代わりにファイルパスを取得するにはどうすればよいですか?
ラファエルリマ

44

これは、rawフォルダーからXMLファイルを取得する例です。

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

次に、次のことができます。

 String sxml = readTextFile(XmlFileInputStream);

いつ:

 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
問題は、XYZの名前は文字列としてのみ使用できるため、R.raw.XYZを使用できないことです。しかし、サイモンのリンクは私が問題を解決するのに役立ちます。別の答えとして正しい解決策を示します。
Bernd 2013

3
これは完全に正常に機能しますInputStream input = Context.getResources().openRawResource(R.raw.configjson);
誰か

13

を使用して、raw / resでファイルを読み取ることができますgetResources().openRawResource(R.raw.myfilename)

ただし、使用するファイル名には小文字の英数字とドットしか含めることができないというIDEの制限があります。ファイル名のようなので、XYZ.txtまたはmy_data.binRに表示されません


9
リソースファイル名にもアンダースコアを使用できます
laalto 2013

3
数字も使用できます(最初の文字としてではありません)。
ファントマックス2014年

最初の文字としてではありません...それは有効なJava変数識別子ではないためです
peterchaula

1

Kotlinを使用してrawリソースを読み取ることができる2つのアプローチを次に示します。

リソースIDを取得することで取得できます。または、プログラムでファイル名をインクリメントして変更できる文字列識別子を使用することもできます。

乾杯の仲間🎉

// R.raw.data_post

this.context.resources.openRawResource(R.raw.data_post)
this.context.resources.getIdentifier("data_post", "raw", this.context.packageName)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.