虽然Loop在最后一个函数卡住但没有退出重启

时间:2015-08-15 11:41:43

标签: java loops while-loop restart

我正在尝试构建一个永远循环的程序,它首先通过观察文件进行更改。当它改变时,它将保存的字符串保存到文件,然后再次等待文件的另一次更改,如果记录的两个字符串相同,则将一些信息上传到MySQL DB,但是在while循环中的最后一个函数重复重复并且没有完成while循环并重新启动!

这是我的代码,

package ClockCard;

import static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.sql.Timestamp;

public class FileWatch implements Runnable {

    static String clkID;
    static String clkID2;
    static String ts;
    static String ts1;
    static boolean done = false;
    static boolean REdone = false;
    static boolean finished = false;
    static boolean ready;

    public static void main(String[] args) throws IOException,
            InterruptedException {


        while (true) {
            checkFile();
            Thread.sleep(3000);
            REcheckFile();
            Thread.sleep(500);
            //Thread.
            if (clkID.equals(clkID2)) {

            DbConnect.test();

            }

            else {
                System.out.println("Wrong matching ID's");
            }
         }
    }   

    // Thread th = new Thread(new FileWatch());
    // th.start();
    // checkFile();
    // REcheckFile();
    // if (clkID2.equals(clkID2)){
    // System.out.println("worked");
    // }
    // else {
    // System.out.println("not worked");
    // }
    //
    public static void check() throws InterruptedException{

        checkFile();
        Thread.sleep(3000);
        REcheckFile();
        Thread.sleep(500);

    }


    public String getClkId() {

        return clkID;

    }

    public static void checkFile() {
        while (!done) {
            try {
                WatchService watcher = FileSystems.getDefault()
                        .newWatchService();
                Path dir = Paths.get("C:\\test");
                dir.register(watcher, ENTRY_MODIFY);

                System.out.println("Watch Service registered for dir: "
                        + dir.getFileName());

                WatchKey key;
                try {
                    key = watcher.take();
                } catch (InterruptedException ex) {
                    return;
                }

                for (WatchEvent<?> event : key.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();

                    @SuppressWarnings("unchecked")
                    WatchEvent<Path> ev = (WatchEvent<Path>) event;
                    Path fileName = ev.context();

                    System.out.println(kind.name() + ": " + fileName);

                    if (kind == ENTRY_MODIFY
                            && fileName.toString().equals("test.txt")) {
                        System.out.println("My source file has changed!!!");
                        String sCurrentLine = null;
                        try (BufferedReader br = new BufferedReader(
                                new FileReader("C:\\test\\test.txt"))) {
                            while ((sCurrentLine = br.readLine()) != null) {
                                System.out.println(sCurrentLine);
                                clkID = sCurrentLine;
                                System.out.println(clkID);
                                java.util.Date date = new java.util.Date();
                                date = new Timestamp(date.getTime());
                                // System.out.println(new
                                // Timestamp(date.getTime()));
                                ts = date.toString();
                                System.out.println(ts);
                            }

                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        File inputFile = new File("C:\\test\\test.txt"); // Your
                                                                            // file
                        File tempFile = new File("C:\\test\\myTempFile.txt");// temp
                                                                                // file
                        BufferedReader reader = new BufferedReader(
                                new FileReader(inputFile));
                        BufferedWriter writer = new BufferedWriter(
                                new FileWriter(tempFile));
                        String currentLine;
                        while ((currentLine = reader.readLine()) != null) {
                            currentLine = ("");
                            writer.write(currentLine);
                        }
                        writer.close();
                        reader.close();
                        done = true;
                        boolean successful = tempFile.renameTo(inputFile);
                        System.out.println(successful);
                    }
                }

                boolean valid = key.reset();
                if (!valid) {
                    break;
                }
            }

            catch (IOException ex) {
                System.err.println(ex);
            }

        }
    }

    public static void REcheckFile() {
        while (!REdone) {
            try {
                WatchService watcher = FileSystems.getDefault()
                        .newWatchService();
                Path dir = Paths.get("C:\\test");
                dir.register(watcher, ENTRY_MODIFY);

                System.out.println("Watch Service registered for dir: "
                        + dir.getFileName());

                WatchKey key;
                try {
                    key = watcher.take();
                } catch (InterruptedException ex) {
                    return;
                }

                for (WatchEvent<?> event : key.pollEvents()) {
                    WatchEvent.Kind<?> kind = event.kind();

                    @SuppressWarnings("unchecked")
                    WatchEvent<Path> ev = (WatchEvent<Path>) event;
                    Path fileName = ev.context();

                    System.out.println(kind.name() + ": " + fileName);

                    if (kind == ENTRY_MODIFY
                            && fileName.toString().equals("test.txt")) {
                        System.out.println("My source file has changed!!!");
                        String sCurrentLine = null;
                        try (BufferedReader br = new BufferedReader(
                                new FileReader("C:\\test\\test.txt"))) {
                            while ((sCurrentLine = br.readLine()) != null) {
                                System.out.println(sCurrentLine);
                                clkID2 = sCurrentLine;
                                System.out.println(clkID2);
                                java.util.Date date1 = new java.util.Date();
                                date1 = new Timestamp(date1.getTime());
                                // System.out.println(new
                                // Timestamp(date.getTime()));
                                String ts1 = date1.toString();
                                System.out.println(ts1);
                            }

                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        File inputFile = new File("C:\\test\\test.txt"); // Your
                                                                            // file
                        File tempFile = new File("C:\\test\\myTempFile.txt");// temp
                                                                                // file
                        BufferedReader reader = new BufferedReader(
                                new FileReader(inputFile));
                        BufferedWriter writer = new BufferedWriter(
                                new FileWriter(tempFile));
                        String currentLine;
                        while ((currentLine = reader.readLine()) != null) {
                            currentLine = ("");
                            writer.write(currentLine);
                        }
                        writer.close();
                        reader.close();
                        REdone = true;
                        boolean successful = tempFile.renameTo(inputFile);
                        System.out.println(successful);
                    }
                }

                boolean valid = key.reset();
                if (!valid) {
                    break;
                }
            }

            catch (IOException ex) {
                System.err.println(ex);
            }

        }
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        checkFile();
    }

}

dbConnect.test()只是输出测试,但它不断输出测试测试而不是重启,任何帮助都会非常感谢!!

强尼

1 个答案:

答案 0 :(得分:0)

checkFile()ReCheckFile()方法中,您使用doneReDone字段进行循环播放。

但是一旦他们都被设置为true,你的方法都变得无用了。并且在第一次迭代中将设置为true(仅在它设置为true之后,它将退出方法)。

因此,从第二次迭代开始,checkFile()reCheckFile()实际上无法执行。

将字段重置为falsecheckFile()方法顶部的reCheckFile(),或whilemain循环内的字段。