我已经实现了一个在我的计算机上运行的数据结构,现在我正在尝试将其移植到我的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
我的所有代码都是使用带有FileInputStream的FileChannel
构建的,所以我想继续使用它。有没有办法从InputStream
context.getResources().openRawResource(fileID)
开始,然后将其转换为FileChannel
?
有些相关的帖子,我无法找到适用于我的案例的工作解决方案:
How to convert InputStream to FileInputStream
答案 0 :(得分:6)
资源不是文件。因此,它不能用作内存映射文件。如果你拥有如此庞大的资源,他们需要进行内存映射,那么它们根本就不应该是资源。如果它们很小,则内存映射没有任何优势。
答案 1 :(得分:0)
这可能会迟到,但我认为您可以间接从InputStream获取FileInputStream。我建议的是:从资源获取输入流,然后创建临时文件,从中获取FileOutputStream。读取InputStream并将其复制到FileOutputStream。
现在临时文件包含资源文件的内容,现在您可以从该文件创建FileInputStream。
我不知道这个特定的解决方案对你有用,但我认为它可以在其他情况下使用。 例如,如果您的文件位于assets文件夹中,则使用此方法获取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);