JAVA使用commons-io 监控文件夹中文件(夹)的增删改

xu.wang

发布于 2020.02.10 00:23 阅读 3112 评论 0

    在上篇文章中,我们提到可以将直播服务器中的文件上传到OSS中,对拉流(播放)进行加速,本文主要介绍使用java来完成文件夹增删改的监控以及OSS的上传操作。

一、引用maven包

    

 <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.6</version>
    </dependency>

    <!--    阿里云oss sdk-->
    <dependency>
      <groupId>com.aliyun.oss</groupId>
      <artifactId>aliyun-sdk-oss</artifactId>
      <version>3.8.0</version>
    </dependency>

二、OSS上传代码

    此处使用线程来进行上传操作。

package com.krs.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;

import java.io.File;

/**
 * 创建OSS上传线程
 */
public class OssFileUploadThread implements Runnable {

    String name;
    String filePath;

    public OssFileUploadThread(String name){
        this.name = name;
    }

    public void setValue(String filePath) {
        this.filePath = filePath;
    }

    public void run() {

        System.out.println("上传文件到OSS:"+filePath);
        //获取文件名称,在OSS中文件重名时进行覆盖
        String[] fileNames = filePath.split("/");
        String objectName = fileNames[fileNames.length-1];

        // 此处为华北2(北京)的Region,其它Region请按实际情况填写。
        String endpoint = "http://oss-cn-beijing.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
        String accessKeyId = "<yourAccessKeyID>";
        String accessKeySecret = "<yourAccessKeySecret>";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        // 创建PutObjectRequest对象。
        PutObjectRequest putObjectRequest = new PutObjectRequest("<yourBucket>", objectName, new File(filePath));

        // 上传文件。
        ossClient.putObject(putObjectRequest);

        // 关闭OSSClient。
        ossClient.shutdown();

    }
}

三、创建文件变化监听器

package com.krs.utils;

import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;

import java.io.File;

/**
 * 文件变化监听器
 *
 * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
 * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
 * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
 *
 *
 */
public class FileListener extends FileAlterationListenerAdaptor {
    /**
     * 文件创建执行
     */
    public void onFileCreate(File file) {
        System.out.println("[新建]:" + file.getAbsolutePath());
        //使用构造器传值
        OssFileUploadThread testThread1 = new OssFileUploadThread("file create thread ");
        //使用set方法进行传值
        testThread1.setValue( file.getAbsolutePath());
        //启动线程
        Thread thread1 = new Thread(testThread1);
        thread1.start();
    }

    /**
     * 文件创建修改
     */
    public void onFileChange(File file) {
        System.out.println("[修改]:" + file.getAbsolutePath());
        //使用构造器传值
        OssFileUploadThread testThread1 = new OssFileUploadThread("file change thread ");
        //使用set方法进行传值
        testThread1.setValue( file.getAbsolutePath());
        //启动线程
        Thread thread1 = new Thread(testThread1);
        thread1.start();
    }

    /**
     * 文件删除
     */
    public void onFileDelete(File file) {
        System.out.println("[删除]:" + file.getAbsolutePath());
    }

    /**
     * 目录创建
     */
    public void onDirectoryCreate(File directory) {
        System.out.println("[新建]:" + directory.getAbsolutePath());
    }

    /**
     * 目录修改
     */
    public void onDirectoryChange(File directory) {
        System.out.println("[修改]:" + directory.getAbsolutePath());
    }

    /**
     * 目录删除
     */
    public void onDirectoryDelete(File directory) {
        System.out.println("[删除]:" + directory.getAbsolutePath());
    }

    public void onStart(FileAlterationObserver observer) {
        // TODO Auto-generated method stub
        super.onStart(observer);
    }

    public void onStop(FileAlterationObserver observer) {
        // TODO Auto-generated method stub
        super.onStop(observer);
    }

}

四、创建Controller,启动监听

package com.krs.controller;

import com.krs.utils.FileListener;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;

@RestController
@RequestMapping("/file")
public class FieUtilController {

    /**
     * 监控文件夹中文件(夹)的修改
     * @param rootDir 监听路径
     * @param interval 监听轮询时间(毫秒)
     * @throws Exception
     */
    @GetMapping("listen")
    public  void listen(@RequestParam(defaultValue = "",required = false)String rootDir,
                        @RequestParam(defaultValue = "8000",required = false)Long  interval
                        ) throws Exception{
     
        // 创建过滤器
        IOFileFilter directories = FileFilterUtils.and(
                FileFilterUtils.directoryFileFilter(),
                HiddenFileFilter.VISIBLE);
        IOFileFilter files       = FileFilterUtils.and(
                FileFilterUtils.fileFileFilter()
        );
        IOFileFilter filter = FileFilterUtils.or(directories, files);
        // 使用过滤器
        FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), filter);
        //不使用过滤器
        //FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir));
        observer.addListener(new FileListener());
        //创建文件变化监听器
        FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observer);
        // 开始监控
        monitor.start();
    }

}

启动监听时直接请求连接即可,例如:IP为192.168.1.123,监听目录为:/www/hls,轮询时间为8s。

则地址为:http://192.169.1.123:8080/file/listen?rootDir=/www/hls&interval=8000