InputStream - 在什么时候下载数据

时间:2013-08-27 19:27:09

标签: java stream

我有4行代码来下载Bitmap,

URL u = new URL(webaddress);

InputStream in = null;

in = u.openStream();

icon = BitmapFactory.decodeStream(in);

我计划更改最后一行以执行与此tutorial类似的操作,其中我只将内存大小的图像加载到内存中以减少内存使用量。但是,我不希望这涉及另一个服务器呼叫/下载,所以我很好奇上面四行中的哪一行实际上从源中下载了数据?

我将把上一行代码更改为上面提到的教程中的最后两行函数,这样可以知道它是否意味着下载更多或更少的数据,(我试图只下载一个来自一个可能是例如5百万像素的小图像)

道歉,如果这很简单/错误的方式来考虑它,我对数据流不是很有经验。


修改

我使用这两个函数来替换上面的最后一行代码: 打电话:

image = decodeSampledBitmapFromStram(in, 300,300);

图像质量不是优先考虑的,这是否意味着下载更多数据?

private static int calculateInSampleSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            // Calculate ratios of height and width to requested height and
            // width
            final int heightRatio = Math.round((float) height
                    / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);

            // Choose the smallest ratio as inSampleSize value, this will
            // guarantee
            // a final image with both dimensions larger than or equal to the
            // requested height and width.
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }

        return inSampleSize;
    }

    private Bitmap decodeSampledBitmapFromStream(InputStream in, int reqWidth, int reqHeight) {
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        Rect padding = new Rect();
        BitmapFactory.decodeStream(in, padding, options);

        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;

        return BitmapFactory.decodeStream(in, padding, options);
    }

2 个答案:

答案 0 :(得分:1)

您的四行中的最后一行负责整个下载。 BitmapFactory.decodeStream(in);将继续从该流中提取数据,直到整个图像被下载或中途发生错误。

至于带宽问题,我会非常小心地了解解码器在尝试之前如何对大图像进行下采样。在将大图像缩小到较小尺寸时,以高质量方式执行此操作的唯一方法是通过平均原始图像中的像素来进行下采样。如果解码器以这种方式进行下采样,那么您将不会保存任何带宽,因为解码器仍然需要读取原始图像的每个像素,即使并非每个像素都存储在RAM中。您可以通过不读取原始图像中的每个像素来更快地进行下采样,但代价是最终图像质量。在这些方面,我确实注意到了一个偏好“质量超速”的选项:

http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inPreferQualityOverSpeed

我有一种感觉,对于这个特殊选项,您可以通过读取更少的数据来获得更快的速度,但API声明这仅适用于JPEG。不确定这是否有助于您的特定用例,但可能值得研究。

答案 1 :(得分:1)

以下文档可帮助您更好地了解有关流 http://docs.oracle.com/javase/tutorial/essential/io/streams.html的信息。简而言之,一旦建立了与资源位置的连接,就检索/读取确定大小的缓冲区(数据的一部分)。通常,继续该过程直到读取所有部分。

流媒体的主要优势是以便餐方式运营。例如,假设您要下载大小为500 MB的图像。流式传输允许以块的形式下载,而不是一次性传输。这在错误处理,重试,峰值网络利用率等方面更好。