Java InputStream-在什么点下载数据

Java InputStream-在什么点下载数据,java,stream,Java,Stream,我有4行代码来下载位图 URL u = new URL(webaddress); InputStream in = null; in = u.openStream(); icon = BitmapFactory.decodeStream(in); 我计划改变最后一行,做一些类似的事情,我只在内存中加载一个设置大小的图像,以减少内存使用。但是,我不希望这涉及到另一个服务器调用/下载,所以我很好奇上面四行中的哪一行实际上从源代码下载了数据 我将把最后一行代码改为上面提到的教程中的最后两个函数

我有4行代码来下载位图

URL u = new URL(webaddress);

InputStream in = null;

in = u.openStream();

icon = BitmapFactory.decodeStream(in);
我计划改变最后一行,做一些类似的事情,我只在内存中加载一个设置大小的图像,以减少内存使用。但是,我不希望这涉及到另一个服务器调用/下载,所以我很好奇上面四行中的哪一行实际上从源代码下载了数据

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

抱歉,如果这是一个简单/错误的想法,我对数据流不是很有经验


编辑

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

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);
    }
private static int calculateInSampleSize(BitmapFactory.Options、,
输入要求宽度,输入要求高度){
最终内部高度=options.outHeight;
最终整数宽度=options.outWidth;
int inSampleSize=1;
如果(高度>要求高度| |宽度>要求宽度){
//计算高度和宽度与所需高度和宽度的比率
//宽度
最终整数高度比=数学圆((浮动)高度
/(浮动)高度);
最终整数宽度比=数学圆((浮动)宽度/(浮动)宽度);
//选择最小比率作为采样值,这将
//保证
//最终图像的两个尺寸均大于或等于
//要求的高度和宽度。
inSampleSize=高度比<宽度比?高度比:宽度比;
}
返回样本大小;
}
私有位图解码SampleDbitMapFromStream(输入流输入、int-reqWidth、int-reqHeight){
//使用INJUSTDECBOUNDS首次解码=true检查尺寸
final BitmapFactory.Options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
Rect padding=new Rect();
解码流(输入、填充、选项);
//计算样本大小
options.inSampleSize=计算样本大小(选项、要求宽度、,
(高度);
//使用inSampleSize集合解码位图
options.inJustDecodeBounds=false;
返回BitmapFactory.decodeStream(输入、填充、选项);
}

四行中的最后一行负责整个下载<代码>位图工厂.解码流(in)将继续从该流中提取数据,直到下载整个图像或中途发生错误

至于带宽问题,在尝试之前,我会非常仔细地了解解码器是如何对大图像进行降采样的。在将大图像缩小为较小尺寸时,以高质量方式进行此操作的唯一方法是通过平均原始图像中的像素来减少采样。如果解码器以这种方式进行下采样,则不会节省任何带宽,因为解码器仍然需要读取原始图像的每个像素,即使不是每个像素都存储在RAM中。通过不读取原始图像中的每个像素,以牺牲最终图像质量为代价,可以更快地减少采样。沿着这些思路,我确实注意到了一个更倾向于“质量胜于速度”的选项:


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

以下文档将帮助您更好地了解流媒体。简而言之,一旦建立到资源位置的连接,就会检索/读取一定大小的缓冲区(数据的一部分)。通常,该过程持续到读取所有部分为止


流媒体的主要优点是以一顿饭的方式进行操作。例如,假设您要下载一个大小为500 MB的图像。流媒体技术允许分块下载,而不是一次性传输。这在错误处理、重试、峰值网络利用率等方面更好。

您可以将inputstream读入缓冲区,然后从缓冲区生成inputstream。因此,基于我更喜欢速度,下载的数据更少而不是质量的假设,您是否建议我坚持使用代码行4或使用两个函数交换它?如果“更喜欢速度”按照我认为的方式工作,然后它将减少读取的数据量,从而减少所需的带宽。如果不是这样,那么就不会有带宽差异,最好还是保留原始代码。如果所有其他方法都失败了,只需同时尝试这两种方法,看看是否可以确定哪个版本读取更多数据。在方法调用的
decodeResource
版本中,是否有任何方法可以使用
InputStream
?如果是这样,您可以使用它来确定读取了多少字节(例如下载的)。我如何使用InputStream来测量读取了多少字节?我可能会修改这两个代码以访问InputStream。您可以扩展
InputStream
,并让它包装您当前使用的任何
InputStream
——只需将所有
InputStream
方法从实现传递到包装流实例。然后,在
read()
方法的实现中,每次成功调用该方法时,递增一个计数器-这将为您提供在每次
decode[Stream/Resource]()
调用期间读取的字节数。