字符IO流和字节IO流的转换实现图片视频的拷贝

封装两个方法,以程序为中心,处理字符输入输出流无法直接转换的图片视频类文件
先读取文件内容转换成字节型数据保存在内存中,再将字节数据还原,写入到指定文件中

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();
   }
  }
 }
 
 
 
 
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值