Android里面将图片保存到本地,到网络上搜索了一下,方法都差不多,大同小异,把输入流转换成输出流的过程而已。最近工作闲,特把其中的两个方法对比一下,看他们的效率如何(找javaSE里面测试的):
第一种方法:
- public static void main(String[] args) {
-
- String url = "http://pic.yesky.com/imagelist/09/01/11277904_7147.jpg";
-
- Long time1 = System.currentTimeMillis();
- Long time2 = 0L;
-
- try {
- FileOutputStream fos = new FileOutputStream( "c:\\tmp.jpg ");
- InputStream is = new URL(url).openStream();
-
- time2 = System.currentTimeMillis();
-
- int data = is.read();
- while(data!=-1){
- fos.write(data);
- data=is.read();
- }
- is.close();
- fos.close();
-
- } catch (IOException e) {
-
- e.printStackTrace();
- }
-
-
- Long time3 = System.currentTimeMillis();
- System.out.println("网络读取流的时间:" + (time2 - time1) + " 把输入流保存成文件的时间:"+ (time3 - time2));
-
- }
第二种方法:中间用buffer做缓存
- public static void main(String[] args){
-
- String url = "http://pic.yesky.com/imagelist/09/01/11277904_7147.jpg";
-
- Long time1 = System.currentTimeMillis();
- Long time2 = 0L;
-
- try {
- int bytesum=0;
- int byteread=0;
- FileOutputStream fos = new FileOutputStream( "c:\\tmp2.jpg ");
- InputStream is = new URL(url).openStream();
-
- time2 = System.currentTimeMillis();
-
- byte[] buffer =new byte[4096];
- while ((byteread=is.read(buffer))!=-1)
- {
- bytesum+=byteread;
-
- fos.write(buffer,0,byteread);
- }
- is.close();
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
-
- Long time3 = System.currentTimeMillis();
- System.out.println("网络读取流的时间:" + (time2 - time1) + " 把输入流保存成文件的时间:"+ (time3 - time2));
-
- }
每个方法测试了三次,结果如下:
第一种方法:
网络读取流的时间:453 把输入流保存成文件的时间:766
网络读取流的时间:344 把输入流保存成文件的时间:344
网络读取流的时间:297 把输入流保存成文件的时间:281
第二种方法:
网络读取流的时间:312 把输入流保存成文件的时间:282
网络读取流的时间:3484 把输入流保存成文件的时间:906
网络读取流的时间:828 把输入流保存成文件的时间:1250
第一种方法,发现效率高过第二种方法,而且第一种方法写法简洁的多。建议用第一种方法。
其实在android里面,不建议直接把网络图片原样写人sd里面,毕竟手机的sd空间是有限的。最常用的方法是把网络图片压缩成jpg格式保存:
- byte[] data = readInputStream(new URL(url).openStream());
- Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0,
- data.length);
-
- bitmap.compress(CompressFormat.JPEG, 100, new FileOutputStream(
- file));
readInputStream()方法的代码:(把输入流转换成比特流)
- public static byte[] readInputStream(InputStream inStream) throws Exception{
- ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
- byte[] buffer = new byte[4096];
- int len = 0;
- while( (len = inStream.read(buffer)) != -1 ){
- outSteam.write(buffer, 0, len);
- }
- outSteam.close();
- inStream.close();
- return outSteam.toByteArray();
- }
分享到:
相关推荐
Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 (三个全) Android异步下载网络图片 ...
android异步下载图片从网络上 分别用handler Asyntask 和线程池
DownLoadImageToGallery: Android 下载图片保存到相册
Android批量下载图片并进行缓存,本例包含内存和文件二重缓存,极大的提高流畅度。
详情查看:https://blog.csdn.net/automoblie0/article/details/122646237
实现异步加载大量图片的源码和例子,包括缓存、硬盘缓存、容错机制等技术。这是一个开源的项目,在github上下载的,实现的很好。
android 图片选择图片上传到服务端并保存到mysql数据库,同时能支持从服务端下载图片资源
一个Android下载网络图片并显示在ImageView上的例程,除了网络上已经泛滥的HttpUrlConnection下载方法之外,还有一个使用HttpClient下载网络图片的方法,代码的编码方式为GBK,我写了注释
Android 网络编程入门之图片下载,搭建Tomcat作为服务器,下载网络图片。
android根据url下载图片的网络ImageView
android 下载图片并缓存的demo
android io 下载图片 android io 下载图片
Android 下载图片 简单 例子 Android Image DownLoader
android 异步加载图片的机制
Android图片下载显示(相册效果)
便捷下载 for Android 支持多平台一键批量下载图片、音频、视频的懒人工具
android 下载图片到sdcard 并保存到指定的文件中
android 图片异步下载,很实用。可以同时下载多张照片
android 获取网络图片 通过HttpURLConnection获取网络图片bitmap 并将图片显示到imageView中
在Android远程上传以及下载图片