采用多线程自动监视并扫描指定文件夹中的文件变化

本文介绍了一个使用Java实现的文件夹监控系统,该系统能够自动监视指定文件夹内的文件变化,并通过多线程技术实时更新文件列表。系统包括文件监听器、监控器等组件,并提供了一个图形界面供用户选择监控的文件夹。

采用多线程自动监视并扫描指定文件夹中的文件变化,实现其功能的代码由四个java文件组成 :FileListener.java,FileMonitor.java,FileTableModel.java,ParseUtility.java.其具体代码如下:

FileListener.java

/*
 * FileListener.java
 *
 * Created on 2007-9-27, 17:58:49
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DirectoryScanner;

/**
 *
 * @author Hale Chou
 */
public interface FileListener {
   
    void dirChanged(FileMonitor monitor);
   
}

FileMonitor.java

/*
 * FileMonitor.java
 *
 * Created on 2007-9-27, 17:59:05
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DirectoryScanner;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Hale Chou
 */
public class FileMonitor implements Runnable {
    List<FileListener> listenerList = new ArrayList<FileListener>();
   
    private File dir;
    private long interval;
    private long lastScanedTime;
    private int oldLength;
  
    public void addListener(FileListener listener) {
        listenerList.add(listener);
    }
  
    public void start(boolean isDamon) {
        Thread t = new Thread(this);
        t.setDaemon(isDamon);
        t.start();
    }

    public FileMonitor(String _dir, long intervalTime) {
        File f = new File(_dir);       
        if(!f.isDirectory())
            throw new RuntimeException();
       
        //筛选出不是标准文件的目录
        File[] fileList = f.listFiles();
        for( int i = 0; i < fileList.length; i++ ) {
            if(fileList[i].isDirectory()) {
                fileList[i].delete();
            }
        }
           
        this.dir = f;
        this.interval = intervalTime ;
        this.oldLength = dir.listFiles().length;
    }
  
    public File[] getMonitoredFile() {
        return this.dir.listFiles();
    }
  
    public void run() {
        while(true) {
            if(!dir.isDirectory())
                throw new RuntimeException();
            if(filesChanged()) {
                fireFilesChangedEvent(this);
            }
            try {
                Thread.sleep(interval);
            }catch(InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
  
    private void fireFilesChangedEvent(FileMonitor monitor) {
        for( int i = 0; i < listenerList.size(); i ++ ) {
            listenerList.get(i).dirChanged(monitor);
        }
    }
 
    protected boolean filesChanged() {
        File[] newFiles = dir.listFiles();
        if(newFiles.length != oldLength) {
            oldLength = newFiles.length;
            //System.out.println(newFiles.length);
            return true;
        }
        for( int i = 0; i < newFiles.length; i++ ) {
            if(newFiles[i].lastModified() >= lastScanedTime) {
                return true;
            }
        }
        return false ;
    }
}


FileTableModel.java

/*
 * FileTableModel.java
 *
 * Created on 2007-9-27, 17:59:28
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DirectoryScanner;

import java.io.File;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Hale Chou
 */
public class FileTableModel extends AbstractTableModel implements FileListener {
    private File[] files = null ;
   
    public FileTableModel(File dir) {
        files = dir.listFiles();       
    }

    public FileTableModel(File[] ff) {
        this.files = ff;           
    }
   
    public int getRowCount() {
        return  files.length;
    }
 
    //  Get a column's name.
    @Override
    public String getColumnName(int col) {
        String s = "文件名,路径,大小,修改时间";
        return s.split(",")[col];
    }
   
    public int getColumnCount() {
        return 4;
    }
 
    public Object getValueAt(int rowIndex, int columnIndex) {
        File f = files[rowIndex];
       
        if(f.isDirectory()){
            f.delete();
        }else{
            switch(columnIndex){
            case 0 :
                return f.getName();
            case 1 :
            return f.getPath();
            case 2 :
            return ParseUtility.bytes2kb(f.length());
            case 3 :
                return ParseUtility.toYYYYMMDDHHMMSS(f.lastModified());
            }
        }
       
        return "";
    }
 
    public void dirChanged(FileMonitor monitor) {
        this.files = monitor.getMonitoredFile();
        fireTableDataChanged();
    }
        
}


ParseUtility.java

/*
 * ParseUtility.java
 *
 * Created on 2007-9-27, 17:59:55
 *
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DirectoryScanner;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 *
 * @author Administrator
 */
public class ParseUtility {
   
    public ParseUtility(){
    }
   
    public static String toYYYYMMDDHHMMSS(long time) {
        SimpleDateFormat format = new SimpleDateFormat("M月d日H时m分s秒");
        return format.format(new Date(time));
    }
   
    public static String bytes2kb(long bytes) {
        BigDecimal filesize = new BigDecimal(bytes);
        BigDecimal megabyte = new BigDecimal(1024 * 1024);
        float returnValue = filesize.divide(megabyte, 2 , BigDecimal.ROUND_UP).floatValue();
        if (returnValue > 1)
            return(returnValue + " MB");
        BigDecimal kilobyte = new BigDecimal(1024);
        returnValue = filesize.divide(kilobyte, 2 , BigDecimal.ROUND_UP).floatValue();
        return (returnValue + " KB");
    }
 
}


最后是调用程序:

/*
 * FileMonitorTest.java
 *
 * Created on 2007年9月28日, 上午9:21
 */

package file;

import java.io.File;
import javax.swing.table.TableModel;
import javax.swing.JFileChooser;
import javax.swing.event.*;

import DirectoryScanner.*;

/**
 *
 * @author  Hale Chou
 */
public class FileMonitorTest extends javax.swing.JFrame {
   
    public TableModel tableModel;
   
    /** Creates new form FileMonitorTest */
    public FileMonitorTest() {                     
        initComponents();            
    }
   
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jLabel1 = new javax.swing.JLabel();
        txt_FilesCount = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        txt_ScannedDirectory = new javax.swing.JTextField();
        btn_StartScan = new javax.swing.JButton();
        btn_SelectDirectory = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(jTable1);

        jLabel1.setText("当前文件数:");

        txt_FilesCount.setEditable(false);

        jLabel2.setText("选择文件夹:");

        btn_StartScan.setText("开始监视");
        btn_StartScan.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_StartScanActionPerformed(evt);
            }
        });

        btn_SelectDirectory.setText("选择目录");
        btn_SelectDirectory.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_SelectDirectoryActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_ScannedDirectory, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btn_SelectDirectory)
                .addContainerGap(31, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txt_FilesCount, javax.swing.GroupLayout.PREFERRED_SIZE, 198, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(btn_StartScan)
                .addContainerGap(31, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 170, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txt_ScannedDirectory, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btn_SelectDirectory)))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txt_FilesCount, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btn_StartScan)))
                .addContainerGap(48, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                       

    private void btn_SelectDirectoryActionPerformed(java.awt.event.ActionEvent evt) {                                                   
        JFileChooser fc = new JFileChooser();
       
        fc.setDialogTitle("Select Directory");

        //fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
       
        int returnVal = fc.showOpenDialog(FileMonitorTest.this);
       
        if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();             
                txt_ScannedDirectory.setText(file.getPath());
            }
        else {
           

            }
    }                                                  

    private void btn_StartScanActionPerformed(java.awt.event.ActionEvent evt) {                                             
        String directory = txt_ScannedDirectory.getText();       
        FileMonitor fileMonitor = new FileMonitor(directory, 100);
        tableModel = new FileTableModel(new File(directory));
        fileMonitor.addListener((FileListener)tableModel);
        fileMonitor.start(true);
       
        jTable1.setModel(tableModel);
       
        tableModel.addTableModelListener(new TableModelListener() {
                public void tableChanged(TableModelEvent e) {                   
                    if(tableModel.getRowCount()>0){
                        txt_FilesCount.setText(String.valueOf(tableModel.getRowCount()));
                    }
                    else{
                        txt_FilesCount.setText("shit,have nothing in it!");
                    }                   
                }
            });
    }                                            
   
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new FileMonitorTest().setVisible(true);
            }
        });
    }
   
    // Variables declaration - do not modify                    
    private javax.swing.JButton btn_SelectDirectory;
    private javax.swing.JButton btn_StartScan;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JTextField txt_FilesCount;
    private javax.swing.JTextField txt_ScannedDirectory;
    // End of variables declaration                  
   
}

内容概要:本文聚焦于不计电池储能寿命损耗的微电网经济调度问题,提出了一种融合电价型、激励型及可中断负荷型三类需求侧响应机制的优化调度模型。研究基于Matlab平台构建了包含光伏、风机、储能系统等多种分布式能源的微电网运行成本最小化模型,详细阐述了目标函数与约束条件的数学建模过程,通过仿真验证了所提策略在降低系统运行成本、实现削峰填谷和提升能源利用效率方面的有效性。该模型强调需求侧资源的灵活调控能力,为微电网的经济高效运行提供了理论支持和技术路径。; 适合人群:电力系统、能源互联网及相关专业的高校研究生、科研人员,以及从事微电网优化调度、综合能源系统规划与运行的工程技术人员。; 使用场景及目标:①用于教学科研中深入理解微电网经济调度的核心原理、建模方法与求解流程;②为实际微电网项目中整合多类型需求侧响应资源、制定优化运行策略提供可复现的仿真工具与技术参考;③作为进一步研究更复杂场景(如计入储能寿命损耗、碳排放约束、不确定性因素等)的优化模型的基础框架。; 阅读建议:读者应具备电力系统基础理论知识和Matlab编程能力,建议结合文中模型逐步复现代码,通过调整负荷曲线、能源价格、响应参数等变量进行敏感性分析,以深化对调度机制的理解。需特别注意,本模型未考虑电池寿命损耗这一关键因素,在实际工程应用中应结合电池老化模型进行补充和完善,以获得更贴近现实的调度方案。
内容概要:本文提出了一种考虑阶梯式碳交易与供需灵活双响应的综合能源系统优化调度模型,通过Matlab代码实现。该模型深度融合了阶梯式碳交易机制与电力系统中需求侧及供给侧的灵活响应能力,构建了一个涵盖电、热、气等多种能源形式耦合的综合能源系统框架。通过引入阶梯碳价机制,有效激励系统低碳运行,同时结合需求响应与供给调整的协同优化策略,显著提升了系统运行的经济性与环保性。研究采用先进的数学优化方法对模型进行求解,实现了对系统内各能源单元出力、储能设备调度、负荷转移等关键变量的全局最优配置,为实现能源高效利用与碳排放最小化的双重目标提供了科学支撑。; 适合人群:具备电力系统、能源系统建模或优化调度等相关背景的科研人员与工程技术人员,特别适合从事综合能源系统规划、低碳调度策略、碳交易机制设计等方向研究的研究生及高校教师。; 使用场景及目标:①深入研究阶梯式碳交易机制在综合能源系统中的建模方法与应用效果;②实现供需双侧灵活互动下的系统经济性与低碳化协同优化调度;③为区域能源系统的低碳转型提供量化分析工具与决策支持依据;④作为Matlab平台下能源系统优化建模的教学案例或科研复现参考。; 阅读建议:建议读者结合提供的Matlab代码逐行解析模型构建过程,重点掌握目标函数与约束条件的数学建模逻辑及其程序实现方式。在学习过程中应积极尝试调整碳价阶梯参数、改变负荷响应场景以观察系统优化结果的变化,从而深化对模型机理的理解。同时,可将本模型与单一碳价或其他需求响应模型进行对比分析,进一步拓展研究视野与创新思路。
已经博主授权,源码转载自 https://pan.quark.cn/s/43c3d5a5f28a 在Web开发领域中,网站系统升级维护提示页面的构建与部署占据着至关重要的地位,特别是在系统进行更新操作或进行故障修复期间,为了确保用户操作的流畅性和数据的完整性,通常会运用到此类提示界面。一个名为"网站系统升级维护提示页面.rar"的归档文件内,收录了完成这一功能所必需的核心构成部分。其中,`index.html`文件作为网页的核心载体,负责构建页面的基本框架和呈现内容。针对当前的应用情境,`index.html`文件极有可能运用一种简约而雅致的布局设计,用以呈现"系统升级维护中"的状态信息。编程人员能够在这个文档中定位到展示企业标识和建设性升级提示的代码单元,且可以依据实际需求进行个性化设置。 `css`目录中存放的是CSS(层叠样式表)文档,这些文档负责设定页面的视觉表现,涵盖色彩搭配、字体选用、页面布局以及响应式设计等多个方面。在系统升级维护的提示页面上,CSS样式或许已经预设了与整体风格相契合的色彩搭配和元素排布,以此保障页面的视觉吸引力和专业性。编程人员可以通过调整这些样式规范来优化页面的整体观感,使其与企业的品牌形象保持一致。 `images`目录则用于存储页面装饰或信息传递所需的图形素材。这些图形可能包含加载指示器、公司标识以及其他与系统升级维护相关的视觉符号。图形素材的挑选和设计对于信息的有效传递以及用户体验的提升具有决定性作用。编程人员可以根据实际需求进行图形素材的替换或增补,确保其与整体页面设计风格相吻合。 `js`目录内包含了JavaScript程序代码,这些代码负责处理页面的交互机制和动态表现。例如,JavaScript代码可能被用于实现计时功能,显...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值