web-dev-qa-db-ja.com

FileInputStreamをアセットフォルダー内のファイルに取得する方法

AssetManagerを使用して_res/raw_ディレクトリからFileを使用してInputStreamを読み取る方法を知っていますが、私の特別なユースケースではFileInputStream。特にFileInputStreamが必要な理由は、getChannel()を呼び出して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;
} 
_

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);
_

_res/raw_ディレクトリのFileInputStreamFileを取得する方法はありますか?

13
Mike Herasimov

次のように、アセット内のリソースに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);
_
15
Xaver Kapeller