目的
将图片读到字节数组中。
将字节数组还原为图片。
分析
对于将图片读到字节数组中,字节数组是内存,既需要使用字节数组流对内存进行写入,但字节数组流不能访问硬盘上的图片,所以要先通过文件字节流将图片读入到内存中。
[图片]—(FileInputStream)—>程序--------(ByteArrayOutputStream)—>[字节数组]
同样的:
[字节数组]----(ByteArrayInputStream)—>程序-------(FileOutputStream)—>[图片]
代码
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 1. 将图片读到字节数组中
* 2. 将字节数组还原为图片
* @author dxt
*
*/
public class IOTest08 {
public static void main(String[] args){
String pic = new String("F:/myjava/IO_Study02/bg.jpg");
System.out.println(fileToByteArray(pic).length);
byteArrayToFile(fileToByteArray(pic),"F:/myjava/IO_Study02/bg2.jpg" );
}
/**
* 将图片读到字节数组中
* 1. 图片-->程序
* 2. 程序-->字节数组
* @param src
* @param datas
*/
public static byte[] fileToByteArray(String src){
//1. 创建源
File picture = new File(src);
//2. 选择流
InputStream fis = null;
ByteArrayOutputStream baos = null;
try {
//2.1 初始化文件读入流对象
fis = new FileInputStream(picture);
//2.2
baos = new ByteArrayOutputStream();
//3. 读文件
int len = -1;
byte[] flush = new byte[1024*10];
while((len = fis.read(flush)) != -1){
baos.write(flush, 0, len); //将flush中的内容写出到字节数组中
}
//释放资源
baos.flush();
fis.close();
return baos.toByteArray(); //返回内存中的字节数组
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} finally{
try {
if(null != fis){
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null; //出错
}
/**
* 将内存中的字节数组还原为图片
* 1. 字节数组 ---> 程序
* 2. 程序 --->图片
* @param datas
* @param dest
*/
public static void byteArrayToFile(byte[] datas, String dest){
//1. 创建源
File picture = new File(dest);
//2. 选择流
InputStream bais = null;
OutputStream os = null;
//2.1 创建字节输入流对象
bais = new ByteArrayInputStream(datas);
try {
//2.2 创建字节输出流对象
os = new FileOutputStream(picture, true); //append
//3. 读字节数组
byte[] flush = new byte[5];
int len = -1;
while((len = bais.read(flush)) != -1){
os.write(flush, 0, len); //向文件中写数据
}
os.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} finally{
try{
if(null != os){
os.close();
}
} catch(IOException e){
e.printStackTrace();
}
}
}
}