文件通过文件输入流,以程序为中转,程序通过字节数组输出流写入字节数组
通过字节数组输入流将字节数组读到程序中,然后通过文件输出流在还原为文件。
以程序为中心
1.图片转为字节数组
2.将字节数组还原为文件
public class TestCombine {
public static void main(String[] args) {
// TODO Auto-generated method stub
byte[] datas=fileToByteArray("copy.jpg");
byteArrayToFile(datas,"copy_byte.jpg");
}
/**
* 1.图片转为字节数组
* 图片到程序FileInputStream
* 程序到数组 ByteArrayOutputStream
*/
public static byte[] fileToByteArray(String FilePath){
//1.创建源与目的的
File src=new File(FilePath);
byte[] dest=null;//在字节数组输出的时候是不需要源的。
//2.选择流,选择文件输入流
InputStream is=null;//方便在finally中使用,设置为全局变量
ByteArrayOutputStream os=null;//新增方法
try {
is=new FileInputStream(src);
os=new ByteArrayOutputStream();
//3.操作,读文件
byte[] flush=new byte[1024*10];//10k,创建读取数据时的缓冲,每次读取的字节个数。
int len=-1;//接受长度;
while((len=is.read(flush))!=-1) {
//表示当还没有到文件的末尾时
//字符数组-->字符串,即是解码。
os.write(flush,0,len);//将文件内容写出字节数组
}
os.flush();
return os.toByteArray();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//4.释放资源
try {
if(is!=null) {//表示当文打开时,才需要通知操作系统关闭
is.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
/**
*2.将字节数组还原为文件
* 字节数组到程序ByteArrayInputStream
* 程序到文件。FileOutputStream
*/
public static void byteArrayToFile(byte[] src,String FilePath){
//1.创建源
File dest=new File(FilePath);//该文件是不存在的,会在相应的路径下创建
// 2.选择流
FileOutputStream os=null;
ByteArrayInputStream is=null;
try {
//3.操作
os=new FileOutputStream(dest);
is=new ByteArrayInputStream(src);
//将内容写出
byte[] flush=new byte[1024*10];//创建读取数据时的缓冲,每次读取的字节个数。
int len=-1;//接受长度;
while((len=is.read(flush))!=-1) {
//表示当还没有到文件的末尾时
//字符数组-->字符串,即是解码。
os.write(flush,0,len);//
}
os.flush();
}catch(FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
//4.释放资源
try {
if (null != os) {
os.close();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
}