Reputation: 1359
I know how to use the AssetManager
to read a File
from the res/raw
directory with an InputStream
, but for my special use case I need a FileInputStream
. The reason I need a FileInputStream
specifically is because I need to get the FileChannel
object from it by calling getChannel()
.
This is the code I have so far, it reads the data (in my case a list of primitives) from a File
:
public static int[] loadByMappedBuffer(Context context, String filename) throws IOException{
FileInputStream fis = context.openFileInput(filename);
FileChannel ch = fis.getChannel();
MappedByteBuffer mbuff = ch.map(MapMode.READ_ONLY, 0, ch.size());
IntBuffer ibuff = mbuff.asIntBuffer();
int[] array = new int[ibuff.limit()];
ibuff.get(array);
fis.close();
ch.close();
return array;
}
I had tried to create File
from an Uri
, but that just results in a FileNotFoundException
:
Uri uri = Uri.parse("android.resource://com.example.empty/raw/file");
File file = new File(uri.getPath());
FileInputStream fis = new FileInputStream(file);
Is there a way I can get a FileInputStream
to a File
in the res/raw
directory?
Upvotes: 20
Views: 19889
Reputation: 3593
small tweeking in "@Xaver Kapeller" answer:
if u don't get "assetManager" use "ctx.getAssets()" instead;
AssetFileDescriptor assetFileDescriptor = ctx.getAssets().openFd(fileName);
FileDescriptor fileDescriptor = assetFileDescriptor.getFileDescriptor();
FileInputStream stream = new FileInputStream(fileDescriptor);
Upvotes: 1
Reputation: 49817
You can get a FileInputStream
to a resource in your assets like this:
AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName);
FileInputStream stream = fileDescriptor.createInputStream();
The fileName
you supply to openFd()
should be the relative path to the asset, the same fileName
you would supply to open()
.
Alternatively you can also create the FileInputStream
like this:
AssetFileDescriptor assetFileDescriptor = assetManager.openFd(fileName);
FileDescriptor fileDescriptor = assetFileDescriptor.getFileDescriptor();
FileInputStream stream = new FileInputStream(fileDescriptor);
Upvotes: 26