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

19

我知道如何使用AssetManagerres/raw目录中读取一个File,并得到一个InputStream对象。但是基于我的特殊需求,我需要一个FileInputStream对象。我需要用getChannel()方法从FileInputStream对象中获取FileChannel对象。

这是我目前的代码,它可以从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;
} 

我曾尝试从Uri创建File,但结果只是一个FileNotFoundException

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

有没有一种方法可以获取到在 res/raw 目录下的 FileFileInputStream


@MichaelHerasimov - 我更新了我的评论 - 你只需要能够从文件中读取,对吧? - Kristy Welsh
@KristyWelsh 但它仍然是 InputStream - Mike Herasimov
FileInputStream myfileInput = getResources().getAssets().open(FILE_NAME); 这样写就可以了。 - Kristy Welsh
@KristyWelsh的open方法返回InputStream - Mike Herasimov
getResources().getAssets().open() 不会返回 FileInputStream,而是返回 AssetInputStream。 - Ayzen
显示剩余15条评论
2个回答

26

您可以通过以下方式获得指向资产资源的FileInputStream

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

openFd()方法所需的fileName应该是相对于资产目录的路径,与您提供给open()方法的fileName相同。

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

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

4
您可以使用 getAssets() 来获取 assetManager - Amr Ashraf

1

在 "@Xaver Kapeller" 的答案中进行了小的调整:
如果您无法获取 "assetManager" ,请改用 "ctx.getAssets()" 代替;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接