res / raw에서 이름으로 파일을 읽는 방법


82

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 간의 매핑을 유지할 수 있습니까?
kabuko 2013-04-09


링크 감사합니다. 나는 별도의 답변으로 올바른 해결책을 줄 것입니다.
Bernd 2013

답변:


147

주어진 링크의 도움으로 직접 문제를 해결할 수있었습니다. 올바른 방법은 다음을 사용하여 리소스 ID를 얻는 것입니다.

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

InputStream으로 가져 오려면

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

15
그냥 명확하게 : 마 하지 앞에 추가 raw/파일 이름. 유효한 예 : .getIdentifier("products","raw", getPackageName());forres/raw/products.json
JJD 2014 년

4
JJD에서 언급했듯이 FILENAME_WITHOUT_EXTENSION 앞에 raw /가 필요하지 않습니다. 예를 들어 두 개의 파일 abc.jpg 및 abc.zip이있는 경우 확장을 사용하려는 경우 두 파일을 모두 원시 폴더에 abc_jpg 및 abc_zip으로 추가 한 다음 (raw 폴더의 확장은 무시 됨) String 변수를 할당합니다. filename = abc.jpg 또는 abc.zip을 사용하고 InputStream ins = getResources (). openRawResource (getResources (). getIdentifier (filename.replace ( ".", "_"), "raw", getPackageName ())); 이것이 누군가에게 도움이
Bruce

열려있는 모든 스트림을 닫는 것을 잊지
Pierre

파일 경로가 필요합니다 ... inputstream 대신 어떻게 얻을 수 있습니까?
Rafael Lima

44

다음은 원시 폴더에서 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 제한이 있습니다. 따라서 파일 이름 은 R에 나열 XYZ.txt되거나 my_data.bin나열되지 않습니다.


9
리소스 파일 이름에도 밑줄이 허용됩니다
laalto

3
또한 숫자도 허용됩니다 (첫 번째 문자가 아님).
Phantômaxx 2014 년

아니 첫 번째 문자로 ... 그 유효한 자바 변수 식별자하지 않기 때문에
peterchaula

1

Kotlin을 사용하여 원시 리소스를 읽을 수있는 두 가지 접근 방식이 있습니다.

리소스 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.