Как сослаться на файл в необработанной папке в Android

Я просто хочу создать объект File, подобный этому

File myImageFile = new File ("image1") ;

но это дает мне исключение из FileNotFoundException
Как я могу сослаться на файл в моей необработанной папке

EDIT: На самом деле я хотел сделать что-то подобное

MultipartEntity multipartEntity= new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); multipartEntity.addPart("uploaded", new FileBody(new File("myimage")));


person waseemwk    schedule 17.03.2012    source источник
comment
а где у тебя папка с изображениями?   -  person    schedule 17.03.2012
comment
@djaqeel Извините, необработанная папка, а не папка с изображениями (которая находится внутри папки res).. Также я пытался получить доступ к изображениям в папке с возможностью рисования, но получил ту же ошибку.   -  person waseemwk    schedule 17.03.2012
comment
вам действительно нужно это как файл, работает ли входной поток для вас?   -  person Boris Strandjev    schedule 17.03.2012


Ответы (4)


здесь 2 функции. один для чтения из RAW и один из активов

/**
 * Method to read in a text file placed in the res/raw directory of the
 * application. The method reads in all lines of the file sequentially.
 */

public static void readRaw(Context ctx,int res_id) {

    InputStream is = ctx.getResources().openRawResource(res_id);
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr, 8192); // 2nd arg is buffer
                                                        // size

    // More efficient (less readable) implementation of above is the
    // composite expression
    /*
     * BufferedReader br = new BufferedReader(new InputStreamReader(
     * this.getResources().openRawResource(R.raw.textfile)), 8192);
     */

    try {
        String test;
        while (true) {
            test = br.readLine();
            // readLine() returns null if no more lines in the file
            if (test == null)
                break;
        }
        isr.close();
        is.close();
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

и из папки «Активы»

/**
 * Read a file from assets
 * 
 * @return the string from assets
 */

public static String getQuestions(Context ctx,String file_name) {

    AssetManager assetManager = ctx.getAssets();
    ByteArrayOutputStream outputStream = null;
    InputStream inputStream = null;
    try {
        inputStream = assetManager.open(file_name);
        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) {
        }
    } catch (IOException e) {
    }
    return outputStream.toString();

}
person OWADVL    schedule 17.03.2012
comment
Что касается метода readRaw, когда он доходит до конца файла, тестовая переменная становится нулевой и, следовательно, становится бесполезной. - person John61590; 04.03.2017
comment
Можете ли вы как-то получить доступ к сырым/активам без использования контекста? - person petryk33; 11.05.2020

Обычно вы получаете доступ к файлам через getResources().openRawResource(R.id._your_id). Если вам абсолютно необходима ссылка на файл, один из вариантов — скопировать его во внутреннюю память:

File file = new File(this.getFilesDir() + File.separator + "DefaultProperties.xml");
try {
        InputStream inputStream = resources.openRawResource(R.id._your_id);
        FileOutputStream fileOutputStream = new FileOutputStream(file);

        byte buf[]=new byte[1024];
        int len;
        while((len=inputStream.read(buf))>0) {
            fileOutputStream.write(buf,0,len);
        }

        fileOutputStream.close();
        inputStream.close();
    } catch (IOException e1) {}

Теперь у вас есть File, к которому вы можете получить доступ в любом месте.

person Grimmace    schedule 17.03.2012
comment
Это мне так помогло! Спасибо! Мне нужен файл для создания Uri для изображения Intent.EXTRA_STREAM, хранящегося в необработанной папке. - person TomaszRykala; 09.05.2014

Вы можете открыть его как InputStream, я не знаю, возможно ли это как файл:

int rid = resources.getIdentifier(packageName + ":raw/" + fileName, null, null);  
//get the file as a stream  
InputStrea is = resources.openRawResource(rid);  
person MByD    schedule 17.03.2012
comment
если он знает имя файла, я бы сказал, что лучше использовать вариант R.raw.id. - person Boris Strandjev; 17.03.2012
comment
@BorisStrandjev - согласен, но иногда люди предпочитают так делать. - person MByD; 17.03.2012
comment
Я читал во многих местах, что это не рекомендуется: сложнее кодировать и с гораздо худшей производительностью. - person Boris Strandjev; 17.03.2012

Вы можете использовать InputStreamBody вместо FileBody, чтобы использовать его следующим образом:

InputStream inputStream = resources.openRawResource(R.raw.yourresource);

MultipartEntity multipartEntity= new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("uploaded", new InputStreamBody(inputStream));
person marsbear    schedule 17.03.2012