文件的增量读取

背景:最近在学习多线程,有一道题目是一个线程不停的向文件中写,写入的内容格式都是一样的。另外一个线程是读线程,实现增量的读取,并进行解析获取所想要的字段。下面是写的小demo,并使用到前面的记忆设计模式

package rememberSet;

public class Scheduler {

    /**

     * 

     * @param args

     */

    public static void main(String[] args) {

        FileWriterScheduler.getIns().setFileName("Desktop/aa");

        FileWriterScheduler.getIns().start();

        FileReaderScheduler.getIns().start();

    }

}

package rememberSet;

/**

 *

 */

public class FileTaskDTO {

    private String fileName;

    private long lastReadBytes;

    private long newReadBytes;

   

    public String getFileName() {

        return fileName;

    }

    

    public void setFileName(String fileName) {

        this.fileName = fileName;

    }

   

    public long getLastReadBytes() {

        return lastReadBytes;

    }

   

    public void setLastReadBytes(long lastReadBytes) {

        this.lastReadBytes = lastReadBytes;

    }

    

    public long getNewReadBytes() {

        return newReadBytes;

    }

    

    public void setNewReadBytes(long newReadBytes) {

        this.newReadBytes = newReadBytes;

    }

}

package rememberSet;

import java.util.Queue;

import java.util.concurrent.ConcurrentLinkedQueue;

/**

 * 

 * 文件读取调度中心

 */

public class FileReaderScheduler {

    private FileReaderScheduler() {

    }

    static FileReaderScheduler fileReaderScheduler = new FileReaderScheduler();

    public static FileReaderScheduler getIns() {

        return fileReaderScheduler;

    }

    private Thread             fileReadThread;

    private ReadFileTask       readFileTask;

    private Queue<FileTaskDTO> queue = new ConcurrentLinkedQueue<FileTaskDTO>();

    public void start() {

        readFileTask = new ReadFileTask(queue);

        fileReadThread = new Thread(readFileTask);

        fileReadThread.start();

    }

    public void submit(FileTaskDTO fileTaskDTO) {

        queue.add(fileTaskDTO);

    }

}

package rememberSet;

/**

 * 文件写入调度中心

 */

public class FileWriterScheduler {

    

    private FileWriterScheduler(){}

    private static FileWriterScheduler fileWriterScheduler=new FileWriterScheduler();

    public static FileWriterScheduler getIns(){

        return fileWriterScheduler;

    }

    

    private String fileName;

    private Thread writeThread;

    private  WriterFileTask writerFileTask;

  

    public  void start(){

        writerFileTask=new WriterFileTask(fileName);

        writeThread=new Thread(writerFileTask);

        writeThread.start();

    }

   

    public String getFileName() {

        return fileName;

    }

   

    public void setFileName(String fileName) {

        this.fileName = fileName;

    } 

}

package rememberSet;

import java.io.UnsupportedEncodingException;

import java.util.Queue;

import java.util.concurrent.TimeUnit;

public class ReadFileTask implements Runnable{

    private Queue<FileTaskDTO> queue;

    

    /**

     * @param fileName

     * @param queue

     */

    public ReadFileTask(Queue<FileTaskDTO> queue) {

        this.queue = queue;

    }

    /** 

     * @see java.lang.Runnable#run()

     */

    @Override

    public void run() {

        while(true){

            FileTaskDTO fileTaskDTO=queue.poll();

            if(fileTaskDTO==null){

                try {

                    TimeUnit.MILLISECONDS.sleep(3000);

                } catch (InterruptedException e) {

                }

            }else{

                readFile(fileTaskDTO);

            }

        }

    }

    private void readFile(FileTaskDTO fileTaskDTO){

        HistoryStatus historyStatus=HistoryStatusRememberSet.getHistoryStatus(fileTaskDTO.getFileName(), true);

        long from=historyStatus.getStart();

        long to=historyStatus.getEnd()+fileTaskDTO.getNewReadBytes();

        

        byte[] data=FileUtils.readFile(fileTaskDTO.getFileName(), from, to);

        try {

            String str=new String(data,"UTF-8");

            System.out.println(Thread.currentThread().getName()+"读取:from:"+from+"to:"+to+"--"+str);

        } catch (UnsupportedEncodingException e) {

        }

        historyStatus.setStart(to);

        historyStatus.setEnd(to);

    }

}

package rememberSet;

public class WriterFileTask  implements Runnable{

    private String fileName;

    

    

    /**

     * @param fileName

     */

    public WriterFileTask(String fileName) {

        this.fileName = fileName;

    }

    /** 

     * @see java.lang.Runnable#run()

     */

    @Override

    public void run() {

        while(true){

            

            try {

                Thread.sleep(5000);

            } catch (InterruptedException e) {

            }

            writerFile(fileName);

        }

    }

    private void writerFile(String fileName){

        byte[] data="我爱你中国".getBytes();

        String contet=null;

        contet = new String(data);

        long writerBytes=FileUtils.writerToFile(fileName, contet, "UTF-8");

        FileTaskDTO fileTaskDTO=new FileTaskDTO();

        fileTaskDTO.setFileName(fileName);

        fileTaskDTO.setNewReadBytes(writerBytes);

        FileReaderScheduler.getIns().submit(fileTaskDTO);

    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IncreSync是多文件夹批量处理的文件增量备份软件,它支持两种同步方式,在线同步和离线同步。在线同步是两台联网机器之间的文件同步,通过共享访问另一台电脑;离线同步是通过U盘等第三方介质进行两台电脑之间的文件同步。IncreSync同步可以是单向同步或双向同步,可以配置是否同步新增、修改、删除和隐藏的文件,以及通过通配符,过滤部分文件。 在线同步时,连接好两台电脑,点击联机同步就可以同步文件。 离线同步时,将U盘插入源电脑,运行程序,点击源端同步将文件同步到U盘,然后将U盘插入目的电脑,点击目的端同步将文件同步到目的目录。 详细的使用方法,请参考系统的帮助文档。 文件同步示意图: 同步方向 按钮 联机同步 移动存储同步 ----------------------------------------------------- |源端同步 | |源端-->U盘 | | | 单向同步 |目的端同步 | |U盘-->目的端 | | | |联机同步 |源端-->目的端 | ----------------------------------------------------- |源端同步 | |U盘-->源端 | | |源端-->U盘 | | | 双向同步 |目的端同步 | |U盘-->目的端 | | |目的端-->U盘 | | | |联机同步 |源端-->目的端 | | |目的端-->源端 | ----------------------------------------------------- 注: 1、源端-->目的端 代表文件从源端同步到目的端,其他的依次类推。 2、在移动存储同步时,需要将本程序拷到U盘等第三方介质,因为临时文件会存储在程序的临时文件夹里。 3、本系统可以通过任务调度,配置为自动同步方式,需要请联系zhayaqi@hotmail.com. 如果你对系统有什么意见或建议,请您发送邮件至zhayaqi@hotmail.com,非常感谢,期待您的反馈!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值