Java 之 IO 流-文件的加密、断点续传、切割、递归拷贝、序列化克隆 等代码实现

IO-文件的加密、断点续传、切割、递归拷贝等

IO流,这章内容大家都感觉内容多,杂,难。下面有几个作业题,你会几个?

1.大文件分割及还原合并

描述:有一个很大的文件需要拷贝,但是U盘只有1G,该怎么办?比如现有一个4G大的文件,需要分割成多个500M的文件,存在指定的文件夹中。

文件切割后,还需要还原合并出原来的文件。

2.任意多个不同类型不同大小文件的合并及拆分?

描述:选择一个指定的目录,下面包含多个不同的文件,实现文件合并成一个文件。 并再实现文件拆分还原为原来文件。

注意:文件中要包含文件名及大小的信息,因为拆分时需要还原为原来的文件名及大小

3.文件断点续传

描述:在QQ中我们在传输文件时,偶尔会碰到网络不稳定而导致传输中断的情况,到那时QQ再次上线时,只要你选择相同文件传输,可以接续上次的文件继续接收。

4.代码量统计器

描述:使用文件选择器,选择一个文件夹,确定后能统计出此文件下及子文件夹下所有的 .java 的总行数。

5.如何使用文件序列化实现对象的深克隆?

描述:序列化是编程中很重要的概念,就是把对象状态转为可存储或可传输的状态的过程。对象克隆就是实现对象的拷贝,产生一个新对象并包含和被克隆对象相同的属性值

6.如何实现文件的加密和解密?

描述:现有部分文件属于私有秘密文件,编写程序实现文件不能正常打开使用。只有通过解密后才能还原出原有的文件,才能正常打开使用。

7.文件夹递归删除

描述:指定一个文件夹,通过程序递归删除文件夹下所有文件及子文件夹下的文件。

8.文件夹的递归拷贝

描述:指定源文件夹及目标文件夹,实现源文件夹下所有文件及子文件夹复制到目标文件夹下,并保持原有的文件结构不变。

1.大文件分割及还原合并

描述:

有一个很大的文件需要拷贝,但是U盘只有1G,该怎么办?比如现有一个4G大的文件,需要分割成多个500M的文件,存在指定的文件夹中。

文件切割后,还需要还原合并出原来的文件。

package com.wdzl.demo01;

import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 文件切割和合并还原
 *
 */
public class Homework1 {
   

    public static void main(String[] args) {
   
        split();
//        merge();
        System.out.println("完成");
    }

    /**
     * 100M文件
     * 分割第一种思路:
     * 正常文件拷贝,读取字节时累计总字节数,统计已读取字节数是否超出设定的大小,超出则换新文件输出流
     */
    public static void split() {
   
        final int MAX = 100*1024*1024;
        String src = "d:/tools/eclipse-jee-2018-12-R-win32-x86_64_includeJDK.zip";
        String dest = "d:/111";

        try(InputStream is = new FileInputStream(src)) {
   
            FileOutputStream out = null;
            byte[] b = new byte[2048];
            int len = 0;
            //
            int total = 0;//累计已经读取的字节数
            int count = 0;
            while((len=is.read(b))!=-1) {
   
                if(count==0) {
   
                    count++;
                    out = new FileOutputStream(dest+"/"+count+".data");
                }
                total += len;
                if(total>MAX) {
   
                    count++;
                    out.close();
                    out = new FileOutputStream(dest+"/"+count+".data");
                    total = 0;///重新开始

                    System.out.println(">>>>==="+count);
                }
                out.write(b, 0, len);
                out.flush();
            }

            out.close();
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
    /**
     * 第二种思路:
     * 根据源文件大小及切割的大小直接计算出需要分割成的总文件数。
     * 然后每次一次性写出一个小文件
     */
    public static void split2() {
   
        final int MAX = 100*1024*1024;
        String src = "d:/tools/eclipse-jee-2018-12-R-win32-x86_64_includeJDK.zip";
        String dest = "d:/111";

        try(InputStream is = new FileInputStream(src)) {
   
            //输入流可用字节数
            int fileSize = is.available();
            //计算分割文件个数
            int count = fileSize%MAX==0?fileSize/MAX:fileSize/MAX+1;

            byte[] b = new byte[MAX];
            for (int i = 0; i < count; i++) {
   
                OutputStream out = new FileOutputStream(dest+"/"+(i+1)+".data");
                int len = is.read(b);
                out.write(b,0,len);
                out.close();
            }

        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }
    /**
     * 文件合并:多个输入流,一个输出流
     */
    public static void merge() {
   
        String srcDir = "d:/111";
        String dest = "d:/x.zip";
        try(OutputStream out = new FileOutputStream(dest)){
   
            File dir = new File(srcDir);
            File[] files = dir.listFiles(new FileFilter() {
   
                public boolean accept(File pathname) {
   
                    String name = pathname.getName();
                    return name.endsWith(".data");
                }
            });
            for (int i = 0; i < files.length; i++) {
   
                InputStream is = new FileInputStream(files[i]);
                //
                byte[] b = new byte[1024];
                int len = 0;
                while((len=is.read(b))!=-1) {
   
                    out.write(b, 0, len);
                }
                is.close();
            }


        }catch (Exception e) {
   
            // TODO: handle exception
        }
    }
}

2.任意多个不同类型不同大小文件的合并及拆分?

描述:

选择一个指定的目录,下面包含多个不同的文件,实现文件合并成一个文件。 并再实现文件拆分还原为原来文件。

注意:文件中要包含文件名及大小的信息,因为拆

  • 25
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zp8126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值