• java实时监测文件夹的变化,允许多用户同时访问,完成文件转移


    java实时监测文件夹的变化,允许多用户同时访问,完成文件转移

    //文件监测类
    import java.util.Map;
    import java.util.HashMap;
    import java.io.File;
    import java.util.Set;
    import java.util.Iterator;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.locks.Lock;
    public class Monitor{
    private String path=null;//监控路径
    private int ScanTime=0;//扫描时间间隔
    private Map<String,String> FileMap=null;
    private TransferFile transfer;
    private String[] FileNames=new String[100];
    private int count=0;//记录传送文件的数量
    private int[] flag=new int[100];
    private int n=3;//创建线程的最大数量
    public static void main(String args[])
    {
    Monitor monitor=new Monitor("D:\\temp2",1);
    monitor.checkFile();
    }
    public Monitor(String path,int ScanTime)
    {
    this.path=path;
    this.ScanTime=ScanTime;
    this.FileMap=new HashMap<String,String>();
    File file=new File(path);
    ScanFile(file,FileMap);//扫描原有目录下的文件
    ShowFile();//显示文件夹下的文件内容

    }
    public void checkFile()
    {
    File file=new File(path);
    ExecutorService exec = Executors.newFixedThreadPool(n);//构建线程池
    while(true)
    {
    try{
    Thread.sleep(1000);
    Map<String,String> nowFileMap=new HashMap<String,String>();
    ScanFile(file,nowFileMap);
    int f=getAddFileMap(nowFileMap);//获得新增加的文件
    if(f==1)
    {
    for(int i=0;i<count;i++)
    {

    ThreadMonitor threadMo=new ThreadMonitor(FileNames[i]);
    Thread t1 = new Thread(threadMo);
    exec.execute(t1);
    for(int j=i;j<count;j++)//删除处理后文件的名字
    {
    FileNames[j]=FileNames[j+1];
    }
    count--;
    }
    }
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }
    }

    }
    public int getAddFileMap(Map<String,String> nowFileMap)
    {
    Iterator<String> iterator=nowFileMap.keySet().iterator();
    while(iterator.hasNext())
    {
    String key=iterator.next();
    if(FileMap.get(key)==null)
    {
    FileNames[count]=key;
    count++;
    FileMap.put(key, nowFileMap.get(key));
    System.out.println("增加:"+nowFileMap.get(key)+count);
    }

    }
    if(count!=0)
    {
    return 1;
    }
    return 0;
    }
    public void ShowFile()
    {
    System.out.print(path+"文件目录如下:\n");
    Set<String> set=FileMap.keySet();
    Iterator<String> iterator=set.iterator();//迭代器
    while(iterator.hasNext())
    {
    System.out.println(FileMap.get(iterator.next()));
    }
    System.out.println("==============================");
    }
    //扫描文件夹下的所有内容
    public void ScanFile(File file,Map<String,String> oldFileMap)
    {
    String[] FileList=file.list();
    //System.out.print(FileList[0]+"dsd");
    if(FileList!=null)//文件列表不为空
    {
    for(int i=0;i<FileList.length;i++)
    {
    String name=file.getAbsolutePath()+"\\"+FileList[i];
    File tempFile=new File(name);
    if(tempFile.isDirectory())
    {
    oldFileMap.put(name, "文件夹 \t"+name);
    ScanFile(tempFile,oldFileMap);
    }
    else
    {
    oldFileMap.put(name, "文件 \t"+name);
    }
    }
    }
    else
    {
    //System.out.print("目前文件夹中还没有文件!");
    }
    }
    }
    class ThreadMonitor implements Runnable{
    private String name=null;
    private TransferFile transfer;
    public ThreadMonitor(String name)
    {
    this.name=name;
    }
    public void run()
    {
    int flag=2;
    while(true)
    {
    try{
    Thread.sleep(1000);
    transfer=new TransferFile();
    flag=transfer.copyFile(this.name,"d:/abc");
    if(flag==0)//代表本文件传输完毕
    {
    break;
    }
    }
    catch(Exception e)
    {
    e.getStackTrace();
    }
    }
    System.out.print(this.name+":"+Thread.currentThread().getName()+"运行完毕");
    }
    }
    //文件转移类
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    public class TransferFile {
    private String oldpath=null;
    private String newpath=null;
    //将文件拷贝到指定的文件夹下
    public int copyFile(String oldpath,String newpath)
    {
    try{
    File oldFile=new File(oldpath);//获取原文件
    File newFile=new File(newpath);
    if(!newFile.exists())//源文件夹不存在,则创建一个
    {
    newFile.mkdir();
    }
    int len=0;
    if(oldFile.exists())//如果文件存在
    {
    FileInputStream inFile=new FileInputStream(oldpath);
    FileOutputStream outFile=new FileOutputStream(newpath+"/"+(oldFile.getName()).toString());
    byte[] buffer=new byte[1024*10];
    while((len=inFile.read(buffer))!=-1)
    {
    outFile.write(buffer, 0, len);
    }
    outFile.flush();
    outFile.close();
    inFile.close();
    oldFile.delete();//删除备份后的原文件
    }
    }catch(Exception e){
    return -1;
    }
    return 0;
    }
    }
  • 相关阅读:
    gym-102307 D. Do Not Try This Problem
    AtCoder Beginner Contest 161 E
    Codeforces 1270E 构造+数学
    2019牛客暑期多校训练营(第七场)E 线段树+离散化区间
    codeforces 1272F dp+记录路径
    Focus相关点滴
    Command模式
    接口隔离原则(ISP)
    依赖倒置原则(DIP)
    Liskov替换原则(LSP)
  • 原文地址:https://www.cnblogs.com/chunxi/p/2238250.html
Copyright © 2020-2023  润新知