需要将 AssetInputStream 转换为 FileInputStream

Need to convert AssetInputStream to FileInputStream

我已经实现了一个在我的计算机上运行的数据结构,现在我正试图将它移植到我的 android 应用程序中。我打开一个原始 .dat 资源并得到一个 InputStream 但我需要得到一个 FileInputStream:

FileInputStream fip = (FileInputStream) context.getResources().openRawResource(fileID);
FileChannel fc = fip.getChannel();
long bytesSizeOfFileChannel = fc.size();
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0L, bytesSizeOfFileChannel);
...

上面的代码抛出以下异常,因为无法将 InputStream 转换为 FileInputStream,但这正是我所需要的:

java.lang.ClassCastException: android.content.res.AssetManager$AssetInputStream cannot be cast to java.io.FileInputStream

我所有的代码都是建立在使用这个 FileChannel 和 FileInputStream 的基础上的,所以我想继续使用它。有没有办法从 context.getResources().openRawResource(fileID) 获得 InputStream 然后将其转换为 FileChannel


一些相关的帖子,我在其中找不到适合我的案例的有效解决方案 android:

How to convert InputStream to FileInputStream

Converting inputStream to FileInputStream?

Using FileChannel to write any InputStream?


资源不是文件。因此,它不能用作内存映射文件。如果您拥有大量需要内存映射的资源,那么它们可能根本不应该是资源。如果它们很小,内存映射就没有优势。

这可能会迟到,但我认为您可以从 InputStream 间接获取 FileInputStream。我的建议是:从资源中获取输入流,然后创建一个临时文件,从中获取一个 FileOutputStream。读取 InputStream 并将其复制到 FileOutputStream。

现在临时文件中包含您的资源文件的内容,现在您可以从该文件创建一个 FileInputStream。

我不知道这个特定的解决方案是否对您有用,但我认为它可以用于其他情况。 例如,如果您的文件位于资产文件夹中,您将获得一个 InputStream,然后使用此方法获得一个 FileInputStream:

InputStream is=getAssets().open("video.3gp");
File tempfile=File.createTempFile("tempfile",".3gp",getDir("filez",0));

FileOutputStream os=newFileOutputStream(tempfile);
byte[] buffer=newbyte[16000];
int length=0;
while((length=is.read(buffer))!=-1){
os.write(buffer,0,length);
}

FileInputStream fis=new FileInputStream(tempfile);