Bitmap和ImageView显示下载的图片(I/O的理解)

简介: 本篇博文Deprecated 最新文章请参见 I/0流的梳理和小结1 利用图片的路径,得到图片的字节数组 public static byte [] getImage(String path) throws Exception{ ...

本篇博文Deprecated 最新文章请参见 I/0流的梳理和小结



1 利用图片的路径,得到图片的字节数组


 public static byte [] getImage(String path) throws Exception{
          URL imageUrl=new URL(path);
  	  HttpURLConnection connection=(HttpURLConnection)imageUrl.openConnection();
    	  connection.setConnectTimeout(5000);
    	  connection.setRequestMethod("POST");
    	  if(connection.getResponseCode()==200){
    		 InputStream inputStream=connection.getInputStream();
    		 byte [] imageData=GetResource.readResource(inputStream);
    		 return imageData;
    	 }
    	 return null;
      }



 分析:
(1)利用URL得到HttpURLConnection connection这样便于资源建立起了联系,且设置connection的属性值
(2)利用HttpURLConnection connection得到输入流.即可以这么想:此时的图片已经保存到了此输入流inputStream里
(3)将在输入流里的图片数据输出到字节数组里面.即byte [] imageData=GetResource.readResource(inputStream).如下

readResource(inputStream)方法如下:

  public static byte[] readResource(InputStream inputStream) throws Exception{
    	ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
    	byte [] buffer=new byte[1024];
    	int len=0;
    	while( (len=inputStream.read(buffer))!=-1){
    		   outputStream.write(buffer,0,len);
    	}
    	inputStream.close();
    	outputStream.close();   	
    	return outputStream.toByteArray();
    }



  分析:
(1)没有方法可以把输入流里的数据直接放到字节数组里(这句说法不太准确哈),而是要利用ByteArrayOutputStream outputStream
   把在输入流自己把自己的数据读(read())到一个字节数组里面,即inputStream.read(buffer),然后数组里面的数据放入
   输出流ByteArrayOutputStream outputStream里面,即outputStream.write(buffer,0,len);
(2)待数据全部转移到输入流outputStream里面,此时就可以把输出流的数据全部转换为字节数组,即outputStream.toByteArray();
(3)在此例子就很好体现了输入流和输出流的使用.
在输入流相应的API中都是把输入流读取到一个数组中,或者只读取一个字节,或者读取一行
如FileInputStream类中的方法:
public int read(byte[] b,int off,int len)从此输入流中将最多 len 个字节的数据读入一个字节数组中
public int read()从此输入流中读取一个数据字节
如在BufferedReader类中的方法:
public String readLine() 读取一个文本行.返回值:包含该行内容的字符串

在输出流相应的API中都把是字节数组写入此输出流,或者只把数组中的某个位置的数据写入输出流
如ByteArrayOutputStream类的方法中:
public void write(byte[] b,int off,int len)将指定字节数组中从偏移量off开始的len个字节写入此字节数组输出流
public void write(int b)将指定的字节写入此字节数组输出流
然后我们可以发现:
(1)可以把输出流里的数据转换为字节数组
如ByteArrayOutputStream类的方法中:
public byte[] toByteArray():创建一个新分配的字节数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中。
(2)可以把输出流里的数据转换为字符串
如ByteArrayOutputStream类的方法中:
public String toString():将缓冲区的内容转换为字符串,根据平台的默认字符编码将字节转换成字符。

有了上面的铺垫就可以更好地理解照片复制:
package cn.io;
//FileInputStream和FileOutputStream实现照片
//注意图片不可以用字符流(如FileReader和FileWriter)拷贝,因为它会去查找字符表
//在方式二中使用InputStream中的available()方法建立缓冲区
//这样操作的好处是不用循环操作,直接先全部暂存在一个数组里,然后再全部取出存到目的地

import java.io.*;
public class CopyPhoto{
	public static void main(String[] args) throws Exception{
		FileInputStream fis=null;
		FileOutputStream fos=null;		
			//…………………………………………以下为方式一
			fis=new FileInputStream("F:\\1.JPG");
			fos=new FileOutputStream("F:\\2.JPG");
			byte [] temp1=new byte[1024*1024];
			int length=0;
			while((length=fis.read(temp1))!=-1){
				fos.write(temp1, 0, length);
				fos.flush();
			}
			//…………………………………………以下为方式二
			fis=new FileInputStream("F:\\3.JPG");
			fos=new FileOutputStream("F:\\4.JPG");
			byte [] temp2=new byte[fis.available()];
			fis.read(temp2);
			fos.write(temp2);
			
			fis.close();
			fos.close();
	}
}



2 生成位图且利用ImageView进行显示
 byte [] imageData=GetImageResource.getImage(path);
 Bitmap bitmap=BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
 imageView.setImageBitmap(bitmap);

相关文章
|
Shell Windows
explorer.exe 该文件没有与之关联的程序来执行该操作
删了点右键的东西搞出来的问题 其实就是关联出错了,解决:(新建一个temp.reg,内容如下,然后双击导入注册表即可) Windows Registry Editor Version 5.00 [[HKEY_CLASSES_ROOT\Folder\shell\explore\comma...
5258 0
|
9月前
|
监控 安全 调度
任务调度企业级场景下的新选择,兼容 XXL-JOB 通信协议
XXL-JOB 是一个开源的分布式任务调度平台,开箱即用、简单易上手,得到了很多开发者的喜爱。和其他中间件开源项目一样,当开发者把开源项目部署到公共云,应用到企业级场景中时,就会在稳定性、性能、安全、其他云产品间集成体验上提出更高的要求。基于此背景,阿里云微服务引擎 MSE 基于自研的分布式任务调度平台 SchedulerX,通过兼容 XXL-JOB 客户端的通信协议,在开源 XXL-JOB 版本的基础上,提升了稳定性、安全、性能、可观测等能力,满足企业客户的需求。此外,为方便测试,提供了一个月 400 元额度的免费试用和预付费首购 5 折、续费 6.5 折起的优惠。
418 179
|
7月前
|
前端开发 Java 关系型数据库
基于DeepSeek的智慧医药系统源码分享
智慧医药系统基于HTML前端、Java后端,使用Springboot、DeepSeek和MySQL技术栈开发。系统分为游客、用户和管理员三个角色,提供疾病与药品查询、智能问诊、个人资料管理、反馈提交等功能。游客可进行搜索查询,用户能修改资料及咨询智能医生,管理员则负责疾病、药品和反馈管理。项目含视频教程,安装依赖环境包括Java、Maven、IntelliJ IDEA和MySQL。源码地址:gitee.com/beginroad/bishe。
173 7
基于DeepSeek的智慧医药系统源码分享
|
存储 人工智能 运维
正式收官!阿里云函数计算携手优酷,用 AI 重塑影视 IP 创新边界
近日,阿里云联合优酷发起的 Create@影视 IP x AI 应用创新大赛,将网剧《少年白马醉春风》这一热门影视 IP 与阿里云 AI 技术相结合,由阿里云函数计算提供 AIGC 技术支持参赛者基于网剧《少年白马醉春风》IP 或“少年江湖”精神内核,用 AI 生成角色场景设计、手办设计、破次元合照、数字人等多样化的作品。
317 11
|
12月前
|
存储 监控 前端开发
如何修改网站后台登录
如何修改网站后台登录
|
消息中间件 存储
RabbitMQ之交换机
【1月更文挑战第9天】 RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上,通常生产者甚至都不知道这些消息传递传递到了哪些队列中。 相反,生产者只能将消息发送到交换机(exchange),交换机工作的内容非常简单,一方面它接收来自生产者的消息,另一方面将它们推入队列。交换机必须确切知道如何处理收到的消息。是应该把这些消息放到特定队列还是说把他们到许多队列中还是说应该丢弃它们。这就的由交换机的类型来决定。
360 96
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
227 3
|
传感器 数据采集 物联网
技术经验解读:【物联网】I2C(IIC)通信协议详解与应用
技术经验解读:【物联网】I2C(IIC)通信协议详解与应用
781 0
|
机器学习/深度学习 算法 计算机视觉
m基于Yolov2深度学习网络的智能零售柜商品识别系统matlab仿真,带GUI界面
MATLAB 2022a中展示了YOLOv2目标检测算法的仿真结果,包括多张检测图像。YOLOv2是实时检测算法,由卷积层和全连接层构成,输出张量包含边界框坐标和类别概率。损失函数由三部分组成。程序使用75%的数据进行训练,剩余25%作为测试集。通过ResNet-50预训练模型构建YOLOv2网络,并用SGDM优化器进行训练。训练完成后,保存模型为`model.mat`。
313 2