如何将FileInputStream获取到资源文件夹中的文件


问题内容

我知道如何使用AssetManager读取带有Fileres/raw目录InputStream,但是对于我的特殊用例,我需要一个FileInputStream。我需要一个FileInputStream专门的原因是因为我需要FileChannel通过调用从它获取对象getChannel()

这是我到目前为止的代码,它从中读取数据(在我的情况下为原语列表)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;
}

我曾尝试通过创建File一个Uri,但这只会导致FileNotFoundException

Uri uri = Uri.parse("android.resource://com.example.empty/raw/file");
File file = new File(uri.getPath());
FileInputStream fis = new FileInputStream(file);

有没有一种方法,我可以得到FileInputStream一个Fileres/raw目录中?


问题答案:

您可以FileInputStream像这样获取资产中的资源:

AssetFileDescriptor fileDescriptor = assetManager.openFd(fileName);
FileInputStream stream = fileDescriptor.createInputStream();

fileName您提供的openFd() 应该是资产的相对路径,同样fileName你会提供给open()

或者,您也可以这样创建FileInputStream

AssetFileDescriptor assetFileDescriptor = assetManager.openFd(fileName);  
FileDescriptor fileDescriptor = assetFileDescriptor.getFileDescriptor();  
FileInputStream stream = new FileInputStream(fileDescriptor);