需要将AssetInputStream转换为FileInputStream

5

我已经实现了一个在我的电脑上运行的数据结构,现在我正在尝试将它移植到我的安卓应用程序中。我打开一个原始的.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
以下是与我的情况相关但无法找到可行解决方案的帖子: 如何将InputStream转换为FileInputStream? 将InputStream转换为FileInputStream? 使用FileChannel写入任何InputStream?

2
不,资源文件不是“普通”的文件,也就是说它们不存在于文件系统中。 - pskink
我已经在这个上面工作了两周。如果我不能让它正常运行,那么我将会笑个不停至少再两周。 - Joop
1
为什么你不能只使用InputStream? - pskink
我的整个目的是在Java中创建一个尽可能快的数据结构,或者至少是我能力范围内最好的。我阅读了这篇文章http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly#FileChannelwithMappedByteBufferandbytearraygets,它指出我使用的方法是最快的。这就是为什么我以这种方式实现它的原因。 - Joop
该文章最多只能表明在Java 6 JVM中使用MappedByteBuffer来读取文件是最快的。而Android并不运行Java 6 JVM,也不会读取文件。Android运行的是Dalvik VM或者ART(取决于Android版本),而你是在读取asset(基本上就是ZIP文件中的一个条目)。因此,该文章的内容大部分都是无关紧要的。 - CommonsWare
公正的观点。可惜我花了两个星期才发现。 - Joop
2个回答

6

资源不是文件。因此,它不能用作内存映射文件。如果您有非常庞大的资源需要进行内存映射,则这些资源可能根本不应该成为资源。如果这些资源很小,则内存映射没有任何优势。


-1
这可能有点晚了,但我认为你可以间接地从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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接