如何将 FileInputStream 获取到资产文件夹中的文件
How to get FileInputStream to File in assets folder
我知道如何使用 AssetManager
从带有 InputStream
的 res/raw
目录中读取 File
,但对于我的特殊用例,我需要一个 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;
}
我曾尝试从 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);
有什么方法可以让 FileInputStream
变成 res/raw
目录中的 File
吗?
您可以像这样获取资产中的资源 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);
“@Xaver Kapeller”中的小推特回答:
如果您没有得到“assetManager”,请改用“ctx.getAssets()”;
AssetFileDescriptor assetFileDescriptor = ctx.getAssets().openFd(fileName);
FileDescriptor fileDescriptor = assetFileDescriptor.getFileDescriptor();
FileInputStream stream = new FileInputStream(fileDescriptor);
我知道如何使用 AssetManager
从带有 InputStream
的 res/raw
目录中读取 File
,但对于我的特殊用例,我需要一个 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;
}
我曾尝试从 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);
有什么方法可以让 FileInputStream
变成 res/raw
目录中的 File
吗?
您可以像这样获取资产中的资源 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);
“@Xaver Kapeller”中的小推特回答:
如果您没有得到“assetManager”,请改用“ctx.getAssets()”;
AssetFileDescriptor assetFileDescriptor = ctx.getAssets().openFd(fileName);
FileDescriptor fileDescriptor = assetFileDescriptor.getFileDescriptor();
FileInputStream stream = new FileInputStream(fileDescriptor);