封装两个方法,以程序为中心,处理字符输入输出流无法直接转换的图片视频类文件
先读取文件内容转换成字节型数据保存在内存中,再将字节数据还原,写入到指定文件中
package cn.sxau.io;
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;
/**
* 封装两个方法,以程序为中心,处理字符输入输出流无法直接转换的图片视频类文件
* 先读取文件内容转换成字节型数据保存在内存中,再将字节数据还原,写入到指定文件中
* @author 王村长
*
*/
public class IOTest09 {
public static void main(String[] args) {
byte[] datas=fileToByteArray("01.jpg");//需要拷贝的文件
System.out.println(datas.length);
bytearrayToFile(datas,"copy.jpg");//拷贝到哪个文件,不存在则直接创建
}
//图片转换成字节数组
//先用FileintputStream以字节数组的形式读取文件数据,将读取到的字节数组直接写入ByteArrayOutputStream流中并输出
public static byte[] fileToByteArray(String filepath){
//1.创建源 和 最终目的地
File file=new File(filepath);//需要读取的源文件
//2.选择流
InputStream is=null;//文件输入流,读取文件内容
ByteArrayOutputStream baos=new ByteArrayOutputStream();//字节数组输出流,用于输出读取到的字节数组
//3.操作
//先进行文件的分段读取
try {
is=new FileInputStream(file);//将文件内容传入流中
baos=new ByteArrayOutputStream();//最终的输出流
//设置缓冲数组,先把流中的数据存储在缓冲数组中
byte[] datas=new byte[1024*10];
//设置接受长度,每次读取多长的字节
int len=-1;
while((len=is.read(datas))!=-1){//read(byte[])进行的是把is输入流中的数据读取到datas中,返回的是datas的长度,如果没有数据可以读取,返回-1
//将datas存储的读取到的字节数据直接传入baos的输出流中
baos.write(datas, 0, len);
}
baos.flush();//进行刷新
return baos.toByteArray();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{//释放资源
try {if(is!=null){
is.close();}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
```}
//把字节数组还原成图片
//先用ByteArrayInputStream读取字节数组数据,再用OutputStream将数据传输到指定文件中
public static void bytearrayToFile(byte[] src,String path){//src 读取的字节数组,filepath 目标文件路径
//1.创建源
File dest=new File(path);//目标文件夹
//2.选择流
InputStream is=null;//输入流读取字节数组数据
OutputStream os=null;//输出流把数据输出到指定文件
try {
is=new ByteArrayInputStream(src);//因为读取的是字节数组,所以要用ByteArrayInputStream
os=new FileOutputStream(dest);//写入指定文件,所以要用FileOutputStream
//3.操作(分段读取)
//设置缓冲数组
byte[] datas=new byte[1024];
//设置接受长度
int len=-1;
while((len=is.read(datas))!=-1){//将is输入流中的字节数组用read方法读取到datas中
os.write(datas, 0, datas.length);//将datas中循环读到的数据循环写入os流中
}
os.flush();//刷新
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{//文件流需要释放资源
try {if(os!=null){
os.close();}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}