IOException - 无法加载文件
我有一个显示GIF图像的应用程序。 这一切工作正常,如果图像保存在绘制,我访问它像这样IOException - 无法加载文件
is=context.getResources().openRawResource(R.drawable.mygif);
movie = Movie.decodeStream(is);
但我需要从互联网上下载图像,所以我将其保存到CacheDir,工作正常。我尝试阅读以下内容。
try
{
is = new BufferedInputStream(new FileInputStream(new File(context.getCacheDir(), "mygif.gif")));
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
movie = Movie.decodeStream(is);
这
movie = Movie.decodeFile(new File(context.getCacheDir(), "mygif.gif").getPath());
但无论怎样,它
java.io.IOException
at java.io.InputStream.reset(InputStream.java:218)
at android.graphics.Movie.decodeStream(Native Method)
at android.graphics.Movie.decodeTempStream(Movie.java:74)
at android.graphics.Movie.decodeFile(Movie.java:59)
或
java.io.IOException: Mark has been invalidated.
at java.io.BufferedInputStream.reset(BufferedInputStream.java:350)
at android.graphics.Movie.decodeStream(Native Method)
结束,我认为这是一个非常简单的错误,但我可以没办法克服它。清单有:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
建议:
1.try移动下载位置到另一个文件夹,如:sdcard
,或应用程序的另一个文件夹,除了cache
。
2.当初始化的inputstream
,尝试使用:初始化一个缓冲区大小
int buffersize = 16*1024;
InputStream is = new BufferedInputStream(xxx,buffersize);
3.to检查文件的文件夹
更新的存在:改变这样的代码和不使用Movie.decodeFile
InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(new File(getCacheDir(), "mygif.gif")), 16 * 1024);
is.mark(16 * 1024);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
movie = Movie.decodeStream(is);
没有异常抛出,而movie
不为空。
另外,虽然您的代码会抛出异常,但movie
也不为空。
1.没有区别;没有区别; 3.它存在且没有损坏 – 2012-04-20 06:30:06
更新答案,请检查。 – idiottiger 2012-04-20 06:53:36
谢谢,下面的代码完成这项工作! mark()丢失。非常感谢 – 2012-04-20 07:07:38
我知道是真的老了后,但我有同样的问题
复制的InputStream字节数组,并呼吁Movie.decodeByteArray工作对我来说,即使是在三星设备
我的回答是基于BeNexuS的回答。
文件的大小可能并不总是已知,请参阅:
File file = ...;
InputStream inputStream = new FileInputStream(file);
或
InputStream inputStream = getContext().getContentResolver().openInputStream(uri);
得到InputStream的后:
BufferedInputStream bis = new BufferedInputStream(inputStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buffer[] = new byte[1024];
int len;
while ((len = bis.read(buffer, 0, buffer.length)) > 0) {
baos.write(buffer, 0, len);
}
bis.close();
byte[] imageData = baos.toByteArray();
baos.close();
Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
的Android高达4.4未能电影解码如果InputStream.reset()方法中存在内部IOException,则从File和Stream处理。但是从字节解码适用于所有版本的Android。这里是相当小的版本代码来做到这一点:
int size = (int) imageFile.length();
byte[] buffer = new byte[size];
FileInputStream inputStream = new FileInputStream(imageFile);
int readLength = inputStream.read(buffer);
inputStream.close();
Movie movie = Movie.decodeByteArray(buffer, 0, readLength);
你应该测试下载和保存部分是否正在破坏文件。在应用程序下载文件后,您可以使用'adb pull'将其从仿真器或设备中拉出。然后你可以检查它是否在服务器上。 –
2012-04-20 04:03:33
我把它从仿真器中拉出来,并没有问题。图像是13kB,如果不知何故很重要 – 2012-04-20 04:14:45
你试过吗?Movie.decodeFile(new File(context.getCacheDir(),“mygif.gif”)。getAbsolutePath())'? – 2012-04-20 04:19:54