IO流—文件拆分与合并

IO流:
在这里插入图片描述
将一个文件拆分为若干个文件的过程如下将一个文件

先将一个文件的全部内容读取到缓存区当中,然后在分别写入多个文件当中。

public static void main(String[] args) throws Exception {
        //原文件(待拆分的文件)
        File file = new File("G:\\video.zip");
        //拆分后的目录
        File file1 = new File("G:\\video"); 
        splitFile(file,file1); 
    }
 private static void splitFile(File file, File file1) throws IOException {
        //判断是否存在文件夹,不存在就创建
        if (!file1.exists()){
            file1.mkdir();
        }
        //思路 : 拆分:1个输入流   ,n个输出流 (a,b,c)
        //合并: n个输入流 ,1个输出流 (注意顺序a,b,c)
        //拆分:1个输入流
        FileInputStream inputStream = new FileInputStream(file);
        FileOutputStream outputStream =null;
        //定义缓冲区为1M,当缓冲区填满时,一次性刷出成一个文件
        byte[] bytes = new byte[1024 * 1024];
        int len =-1;
        int count = 0;
        while((len = inputStream.read(bytes))>0){
            outputStream = new FileOutputStream(new File(file1,count++ +".part"));
            outputStream.write(bytes,0 ,len);
            //关闭流、关闭之前会强行清理缓冲区
            outputStream.close();
        }
        inputStream.close(); 
    }

拆分的时候:如何 将文件名、分割的数量保留,为后续合并做准备,再生成一个配置文件config.properties保存上述描述信息。有以下两种方法:

 //方式一:
 //配置文件
 outputStream = new FileOutputStream(new File("G:\\video\\config.properties"));
 //查询当前系统的换行符
 String properties = System.getProperty("line.separator");
 //文件名
 outputStream.write(("filename="+file.getName()).getBytes());
 outputStream.write(properties.getBytes());
 //拆分的个数
 outputStream.write(("count="+(count-1)).getBytes());
 outputStream.close()
 /***************************************************************/
//方式二: Properties,将内存中的多个 属性以 key=value的形式 写到硬盘中
  Properties properties = new Properties();
  properties.setProperty("filename",file.getName());
  properties.setProperty("count",count+"");
  //写入硬盘 (保存:持久化)
  properties.store(outputStream,"file config");
  outputStream.close();

合并文件:

 public void test1()throws Exception {
        //读取多个拆分后的文件(inputs:所有输入流的集合)
        ArrayList<FileInputStream> inputs = new ArrayList<>();
        //数据先写固定,后面读取配置文件的个数
        for (int i = 0; i < 23; i++) {
            inputs.add(new FileInputStream("G:\\video\\"+i+".part"));
        }
        //指定合并后的文件输出流,写入到my.zip文件当中
        FileOutputStream outputStream = new FileOutputStream("G:\\my.zip");
        //将多个输入流依次读入内存,最后再一次性输出到my.zip 
        byte[] buf = new byte[1024 * 1024];
        for (FileInputStream input : inputs) {
            int read = input.read(buf);
            outputStream.write(buf,0,read);
        }
        //关闭文件
        outputStream.close();
        for (FileInputStream input : inputs) {
            input.close();
        }
    }

优化,通过配置文件读取

/*读取配置文件*/
 public Properties getProperties() throws Exception{
        String path = "G:\\video\\config.properties";
        FileInputStream inputStream = new FileInputStream(path);
        Properties properties = new Properties();
        properties.load(inputStream);
        return properties;
    }

    private void mergeFile() throws Exception {
        //通过配置文件获取filename和count
        Properties properties = getProperties();
        String filename = (String) properties.get("filename");
        int count = Integer.valueOf(String.valueOf(properties.get("count"))) ;
        //System.out.println(filename+":"+count);

        ArrayList<FileInputStream> inputs = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            inputs.add(new FileInputStream("G:\\video\\"+i+".part"));
        }
        //将list集合转换为Enumeration集合
        Enumeration<FileInputStream> enumeration = Collections.enumeration(inputs);
        //多个流 -> 一个流
        SequenceInputStream sin = new SequenceInputStream(enumeration);
        FileOutputStream outputStream = new FileOutputStream("G:\\"+filename);
        int len =-1;
        byte[] bytes = new byte[1024 * 1024];
        while ((len = sin.read(bytes))>0){
            outputStream.write(bytes,0,len);
        }
        outputStream.close();
        sin.close();
    }

读取配置文件信息


public class ConfReader {
    public static void main(String[] args) throws Exception {
        //读取配置文件
        File confFile = new File("G:\\video\\config.properties");
        readConfig(confFile);
    }

    private static void readConfig(File confFile) throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(confFile));
        String line =null;
        //一行一行读取
        while ((line = bufferedReader.readLine())!=null){
            String[] split = line.split("=");
            if (line.startsWith("filename")){
                System.out.println(split[0]+"="+split[1]);
            }else if (line.startsWith("count")){
                System.out.println(split[0]+"="+split[1]);
            }else{
            }
        bufferedReader.close();
    } 
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值