Java 字节数组流之图片转成字节数组

Java 字节数组流之图片转成字节数组,相当于图片的复制
在这里插入图片描述
字符串可以直接读取到字节数组中用(getBytes)

 
问题:将一张图片读到字节数组里面(所有的东西都能够读到字节数组里面)

思路:先使用文件输入流,通过程序做一个中转,程序在写出到字节数组中

还原图片的话:
将字节数组读取到程序中,程序在写出道文件中

以程序为中心

在这里插入图片描述
上面为比较清楚的图
上面为比较清楚的图

某某东西转成字节数组除了字符串其他都需要流来对接

文件流一定要释放资源

字节数组流不一定要释放资源

代码示例:

/*
 * 1、图片读取到字节数组中
 * 2、字节数组写出到文件(图片)
 */
public class IOTest09 {
	
	public static void main(String[] args) {
		// 图片转成字节数组
		byte[] datas = fileToByteArray("E:/gongfang/JavaDemo/linweimao/javaWork/Demo/IO_study02/src/com/lwm/io/p.pngp.png");
		System.out.println(datas.length);
		byteArrayToFile(datas, "p-byte.png");
	}
	/*
	 * 1、图片读取到字节数组中
	 * 	  1)、图片到程序		FileInputStream
	 *    2)、程序到字节数组   ByteArrayOutputStream
	 */
	public static byte[] fileToByteArray(String filePath) {
		// 1、创建源与目的地
		File src = new File(filePath);
		byte[] dest = null;
		// 2、选择流
		InputStream is = null;
		// 有新增方法不能发生多态
		ByteArrayOutputStream baos = null;
		try {
			is = new FileInputStream(src);
			baos = new ByteArrayOutputStream();
			// 3、操作(分段读取)
			byte[] flush = new byte[1024 * 10];// 缓冲容器
			int len = -1;// 接收长度
			try {
				while ((len = is.read(flush)) != -1) {
					// 写出到字节数组中
					baos.write(flush,0,len);
				}
				baos.flush();
				// 返回回来,上面调用时就有了
				return baos.toByteArray();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			// 4、释放资源
			try {
				if (null != is) {
					is.close();
				}
			} catch (IOException e) {
				e.printStackTrace();

			}
		}
		return null;
	}
	
	/*
	 * 2、字节数组写出到文件(图片)
	 * 	  1)、字节数组读取到程序  ByteArrayInputStream
	 *    2)、程序到文件  FileOutputStream
	 */
	public static void byteArrayToFile(byte[] src,String filePath) {
		// 1、创建源
		File dest = new File(filePath);
		// 2、选择流
		InputStream is = null;
		OutputStream os = null;
		try {
			is = new ByteArrayInputStream(src);
			os = new FileOutputStream(dest);
			// 3、操作(分段读取)
			byte[] flush = new byte[5];// 缓冲容器
			int len = -1;// 接收长度
			while ((len = is.read(flush)) != -1) {
				os.write(flush,0,len);
			}
			os.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 释放资源
			try {
				if (null != os) {
					os.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
	}
}

字节数组不同于字节文件,字节文件是保存在硬盘上的,操作系统对其进行统一管理,使用完需要关闭。而字节数组不需要通知操作系统,然后对该资源进行管理。

文件流最后都需要执行close方法,关闭输入流或者输出流,这是因为文件是存储在硬盘上的,Java 虚拟机无法直接访问这些资源,只能通过操作系统访问,访问完后要通知操作系统释放资源.而字节数组流访问的是内存,Java 可以直接访问无需操作系统,操作完成后可以通过Java 的垃圾回收机制(gc)释放.

这个小伙伴的注释多一些:https://www.cnblogs.com/zhangqiling/p/11443923.html

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值