文件的增量读取

背景:最近在学习多线程,有一道题目是一个线程不停的向文件中写,写入的内容格式都是一样的。另外一个线程是读线程,实现增量的读取,并进行解析获取所想要的字段。下面是写的小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);

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值