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原生的Bitmap API在处理大量或大尺寸图片时效率较低,可能导致内存溢出。因此,通常会使用第三方图片加载库,如Glide、Picasso、Fresco等。这些库提供了缓存、内存管理以及网络加载等功能,优化了图片显示的...
在Android开发中,图片操作是不可或缺的一部分,无论是加载网络图片,还是进行图片处理,都需要借助特定的库来实现。本文将深入探讨一个强大的Android图片操作库,并基于提供的压缩包文件"Liberuman-ImageSet-d...
在Android平台上,图片处理是一项重要的任务,特别是在开发各种应用程序,如社交网络、图像编辑器或者游戏时。Android提供了丰富的API和工具,使开发者能够实现类似于Adobe Photoshop(简称PS)的效果。下面将详细...
在Android平台上进行图片处理时,保存格式的选择是一个重要的考虑因素,尤其是当涉及到图像质量和存储效率时。本测试对比主要关注了两种最常见的图片格式:JPEG(jpg)和PNG。以下是这两种格式的特点、优缺点以及在...
2. **图片加载**:BifacialView可能需要支持从资源文件、网络或本地存储加载图片。开发者可能使用了诸如Glide或Picasso这样的图片加载库来简化这一过程。 3. **遮罩设置**:遮罩的透明度可以通过属性或者方法进行...
xUtils是一个全面的安卓开发工具库,包含了网络请求、数据库操作、图片加载等多种功能。它简化了常见的开发任务,提高了开发效率。在这个图片选择框架中,xUtils可能被用来处理图片的加载和显示,以及与服务器的交互...
在Android开发中,图片加载与展示是至关重要的一个环节,特别是在处理用户拍摄的照片或从网络获取的图片时。"Android-FuzzyDetection图片择优选择最清楚的图片)"项目旨在提供一种解决方案,帮助开发者在没有依赖任何...
本文将深入探讨四大主流的Android网络请求库:Volley、Retrofit、OkHttp,并进行实战对比,帮助开发者选择最适合自己的网络请求解决方案。 **Volley** Volley是由Google官方推出的网络请求库,它主要设计目标是...
本文将深入探讨“android各种工具类”这一主题,包括文件操作、日期处理、图片处理、系统服务利用、网络通信以及数据库管理等核心知识点。 1. 文件操作: 在Android中,文件操作是非常基础且重要的功能。开发者需要...
"AndroidUtilCode"是一个全面的Android工具类库,包含了多种实用功能,极大地提升了开发效率。这个库的核心目标是帮助开发者在处理常见任务时减少重复代码,提高代码质量。 AndroidUtilCode库涵盖了许多关键领域的...
3. **第3章:Android网络下的XML解析和生成** - 使用XMLPullParser进行低级别、高效的XML解析。 - DOM和SAX解析器的比较与使用。 - 使用Gson或Jackson库将XML数据转换为Java对象。 - XML的生成,如使用...
Volley通过内存缓存和请求队列管理,优化了图片加载和其他网络资源的获取。适合进行频繁且小量的数据交换,但处理大文件或复杂网络流可能不太合适。 5. **Retrofit**: Retrofit是另一个由Square公司开发的库,它...
8. **Picasso**:这是一个图片加载库,简化了图片的下载和显示,支持缓存和图片处理。 9. **Gson**:Google的另一个JSON库,用于在Java对象和JSON数据之间进行映射,常用于网络数据的序列化和反序列化。 10. **...
它旨在简化Android应用程序中的数据库操作、网络请求以及文件处理等常见任务,使得开发者可以更加专注于业务逻辑的实现,而非底层技术细节。 一、AFinal的核心特性 1. **数据库操作**:AFinal集成了一种基于注解的...
在Android应用开发中,图片验证码(CAPTCHA)是一种常见的安全机制,用于防止自动化脚本或机器人进行恶意操作,如注册、登录等。本教程将详细讲解如何在Android项目中实现图片验证码的功能。 首先,理解图片验证码...
本压缩包“安卓Android源码——自己在用的网络图片加载代码.zip”提供了一个名为“AyncImageLoader-master”的项目,这是一份用于实现异步图片加载的源码示例,下面将对其中的关键知识点进行详细的解析。 1. 异步...
Afinal是一个轻量级的Android ORM框架,同时也提供了方便的网络请求和图片加载功能。在这个源码示例中,我们将深入探讨如何使用Afinal实现图片的简单异步缓存加载。 首先,我们需要了解Afinal的基本概念。Afinal由...
1. **日期时间处理**:在Android应用中,处理日期和时间是常见的需求,如格式化、比较或计算时间差。工具类可能包含`DateUtil`,提供静态方法来方便地进行日期时间的转换和操作。 2. **字符串操作**:`StringUtil`...
在Android开发过程中,工具类(Utils)扮演着至关重要的角色,它们是一系列预先编写好的、通用的函数集合,可以极大地提高开发效率并减少代码重复。"AndroidUtils"就是这样一个专门为Android开发者设计的实用工具库...
XUtils是一个综合性的工具库,包括网络请求、图片加载、数据库操作等功能。虽然XutilsDao的数据库操作较为方便,但由于整个库的功能繁多,可能会增加应用的体积。 为了更直观地对比这些框架,我们进行了性能测试。...