背景
假设我有一个从互联网上获取的图像文件的inputStream。
我希望在解码之前获取有关图像文件的信息。
这对于多种用途非常有用,例如缩小文件大小和在显示图像之前预览信息。
问题
我尝试使用BufferedInputStream包装inputStream来标记&重置inputStream,但它没有起作用:
inputStream=new BufferedInputStream(inputStream);
inputStream.mark(Integer.MAX_VALUE);
final BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeStream(inputStream,null,options);
//this works fine. i get the options filled just right.
inputStream.reset();
final Bitmap bitmap=BitmapFactory.decodeStream(inputStream,null,options);
//this returns null
为了从URL中获取输入流,我使用以下代码:
public static InputStream getInputStreamFromInternet(final String urlString)
{
try
{
final URL url=new URL(urlString);
final HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
final InputStream in=urlConnection.getInputStream();
return in;
}
catch(final Exception e)
{
e.printStackTrace();
}
return null;
}
问题
如何让代码处理标记和重置?
使用资源时它可以完美地工作(实际上,我甚至不需要为此创建一个新的BufferedInputStream),但是在来自互联网的inputStream中却不能正常工作...
编辑:
看起来我的代码很好,但有点...
在一些网站上(比如这个和这个),即使重置后仍无法解码图像文件。
如果你解码位图(并使用inSampleSize),它可以正常解码(只是需要很长时间)。
现在的问题是为什么会发生这种情况,以及如何修复它。