`

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

阅读更多
来源:http://www.189works.com/article-41159-1.html

//文件监测类

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;
     }
}

分享到:
评论

相关推荐

    src.rar_java监控文件夹_文件监控_监控文件

    总结来说,这个项目通过ZJPFileListener和ZJPFileMonitor两个类,实现了基于Java的文件监控功能,能够实时监测文件夹中文件的状态变化,并按照设定的时间间隔进行检查。这对于需要实时跟踪文件系统变化的系统来说...

    股市监测 Java Swing 项目源代码

    5. **jnlp** - 可能包含Java Web Start(JNLP)文件,这是一种部署Java应用程序的方式,允许用户通过Web浏览器下载并运行应用。JNLP文件描述了应用的结构、所需资源以及如何启动应用。 6. **lib** - 库文件夹,存放...

    基于Java的水质检测系统(含数据库文件).zip

    对于初学者而言,通过阅读和理解这个项目的源代码,可以深入了解Java编程、数据库操作、GUI设计等多个方面的知识。同时,这个系统也可作为实际项目经验的积累,帮助提升问题解决和项目管理能力。在实际使用中,根据...

    java毕业设计之远程监测系统源码.zip

    至于"yuanma",根据上下文推测可能是源码的简写,可能指的是项目的源代码文件夹,其中包含了项目的各个模块,如业务逻辑、数据访问层、控制层等,以及相关的配置文件和资源文件。 综上所述,这个Java毕业设计项目...

    java+jquery文件上传 无刷新 带进度条,监控文件上传情况

    `java+jquery`的文件上传技术结合了后端的Java服务器处理和前端的jQuery库来实现无刷新的用户体验,同时提供上传进度条,实时反馈文件上传状态。本文将详细讲解这个主题。 首先,让我们了解Java文件上传的基础。在...

    打字测试软件(JAVA)

    1. **输入检测**:软件需要实时监测用户的键盘输入,与预设的文本进行比较,判断是否正确,并记录错误次数。 2. **计时器**:为测试设置时间限制,模拟实际的打字速度测试环境,增加挑战性。 3. **成绩计算**:根据...

    windows文件夹简介

    - **描述**:SystemProfile文件夹包含了系统默认的用户配置文件信息,用于初始化新用户的环境设置。 - **可否删除**:不建议删除。如果删除,可能会影响新用户账户的创建和设置。 #### 4. **Drivers** - **描述**:...

    java实现gif动画效果(java显示动态图片)

    总结,Java实现GIF动画效果需要结合窗口组件、图像处理、定时器以及可能的用户交互等多方面知识。通过不断刷新并切换图片帧,可以模拟出动态的视觉效果。在实际项目中,还可以考虑优化性能,比如预加载图片、使用...

    北京雨量监测系统.rar

    - "RainManage":这个文件名可能表示一个管理模块,可能是Java源代码文件夹,包含了处理雨量数据管理的类,如数据的增删改查操作,或者与用户交互的控制器。也可能是一个具体的Java类,负责处理雨量数据的业务逻辑。...

    GIS-system.zip_gis java_gis程序设计_实时跟踪系统_轨迹

    "基于GIS的移动对象实时跟踪系统的执行文件"应该是编译后的Java应用程序,可以直接运行来演示系统功能。而"基于GIS的移动对象实时跟踪系统的程序代码"则包含了源代码,可供学习和参考。 在实际应用中,这样的系统...

    悬浮框监视内存变化

    因此,实时监测内存变化可以帮助开发者找出可能导致问题的部分。 “内存”标签强调了这个Demo的重点是内存管理。在Android中,内存管理涉及了解对象生命周期,避免内存泄漏,以及有效地使用Java堆和Dalvik/ART...

    loadrunner 监测linux系统图文详解

    总结来说,LoadRunner监测Linux系统是一个涉及多步骤的过程,包括虚拟环境的搭建、Linux系统的登录问题处理、LoadRunner脚本的编写和执行、文件的传输以及守护线程的管理等。理解并掌握这些知识点,将有助于你在实际...

    eclipse,Myeclipse修改js文件同步插件

    这个“自动同步插件”主要功能在于实时监测JS文件的改动,并将这些更改即时同步到运行中的应用程序。这样,开发者在编辑JavaScript代码后,无需手动刷新浏览器或重启应用,就可以立即看到代码变更的效果。这对于快速...

    wifi状态实时更新与控制系统wifi

    标题中的“WiFi状态实时更新与控制系统”涉及到的是在Android平台上开发的一个应用,它能够监测并控制用户的WiFi连接状态。这个应用的核心功能包括两部分:一是实时获取并显示WiFi的当前状态,二是通过用户界面(UI...

    基于Java Servlet实现的灾情控制系统.zip

    【描述】中提到的“.zip”文件扩展名表明这是一个压缩文件,通常包含多个相关的文件或目录。在这个情况下,压缩包内可能包含了源代码、数据库配置、文档、测试数据等资源,用于完整构建和理解这个灾情控制系统。 ...

    毕业设计源码之群养猪生长状态远程监测.zip

    2. "myProject":这是一个可能包含项目源代码、资源文件、配置文件等所有组成部分的文件夹,用户可以解压后在开发环境中打开,进行代码阅读、调试或二次开发。 综合以上信息,这个项目可能涉及以下知识点: - Java...

    多个机器人的机器人不可知在线协调_Java_C++_下载.zip

    标题 "多个机器人的机器人不可知在线协调_Java_C++_下载.zip" 暗示了这是一个关于多机器人系统中,采用Java和C++编程语言进行的不可知在线协调技术的项目或教程。在这个领域,机器人之间的协作往往需要解决不确定性...

    java毕业设计之基于android的一氧化碳检测app源码.zip

    项目采用Java编程语言,结合Android SDK进行开发,旨在实现一个实时监测环境中一氧化碳浓度的应用,提高用户的安全意识。 首先,项目的开发环境要求如下: 1. **JDK**: 使用的是JDK 1.8版本,这是Java开发的基础,...

    InfoMonitor2_安卓_安卓服务器_实时数据_服务app_监测_源码.zip

    1. **源码文件夹**:包含项目的Java或Kotlin源代码,可能有多个类文件,用于实现数据收集、处理和展示。 2. **资源文件**:如XML布局文件、图片、图标等,用于构建应用的用户界面。 3. **Gradle配置文件**:如build....

Global site tag (gtag.js) - Google Analytics