需要将AssetInputStream转换为FileInputStream

时间:2015-05-09 10:30:10

标签: java android fileinputstream filechannel

我已经实现了一个在我的计算机上运行的数据结构,现在我正在尝试将其移植到我的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

Converting inputStream to FileInputStream?

Using FileChannel to write any InputStream?

2 个答案:

答案 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);