Запись в текстовый файл при использовании многопоточности

Я пытаюсь создать отдельный поток, который периодически перезаписывает файл, так что единственное, что на самом деле изменяется в файле, это то, что я изменил в графическом интерфейсе. Вот соответствующий код:

    private ThreadClass writeToFile = new ThreadClass("toFile"){
        @Override
        public void run(){
            synchronized(lock){
                NameAddressID store[] = new NameAddressID[10];
                boolean tmpFile = true;
                Scanner loadOver;
                PrintWriter overWrite;
                while(true){

                    try {
                        if(tmpFile){
                            loadOver = new Scanner(new File("NAIList.txt"));
                            overWrite = new PrintWriter("NAIList.tmp", "UTF-8");
                        }else{
                            loadOver = new Scanner(new File("NAIList.tmp"));
                            overWrite = new PrintWriter("NAIList.txt", "UTF-8");
                        }
                        for(int i = 0; i < count-1; i++){
                            for(int j = 0; j<10; j++){
                                if(loadOver.hasNextLine()){
                                    String[] tokens = loadOver.nextLine().split(";");
                                        store[j] = new NameAddressID(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5], Integer.valueOf(tokens[6]), Integer.valueOf(tokens[7]));
                                }else{
                                    store[j] = null;
                                }
                            }
                            for(int j = 0; j<store.length;j++){
                                if(store[j] != null){
                                    overWrite.print(store[j].getFirst()+";");
                                    System.out.print(store[j].getFirst()+" ");
                                    overWrite.print(store[j].getMiddle()+";");
                                    System.out.print(store[j].getMiddle()+" ");
                                    overWrite.print(store[j].getLast()+";");
                                    System.out.print(store[j].getLast()+" ");
                                    overWrite.print(store[j].getStreet()+";");
                                    System.out.print(store[j].getStreet()+" ");
                                    overWrite.print(store[j].getCity()+";");
                                    System.out.print(store[j].getCity()+" ");
                                    overWrite.print(store[j].getState()+";");
                                    System.out.print(store[j].getState()+" ");
                                    overWrite.print(store[j].getZip()+";");
                                    System.out.print(store[j].getZip()+" ");
                                    overWrite.println(store[j].getId());
                                    System.out.println(store[j].getId());
                                    store[j] = null;
                                    overWrite.flush();
                                }else{
                                    break;
                                }
                            }

                        }
                        saveArrayText("NAIList.tmp", overWrite);
                        for(int i = 0; i < addressList.size(); i++){
                            if(loadOver.hasNextLine()){
                                String skip = loadOver.nextLine();
                            }
                        }
                        while(loadOver.hasNextLine()){
                            int index = 0;
                            String[] tokens = loadOver.nextLine().split(";");
                            store[index++] = new NameAddressID(tokens[0], tokens[1], tokens[2], tokens[3], tokens[4], tokens[5], Integer.valueOf(tokens[6]), Integer.valueOf(tokens[7]));
                            for(int j = 0; j<store.length;j++){
                                if(store[j] != null){
                                    overWrite.print(store[j].getFirst()+";");
                                    overWrite.print(store[j].getMiddle()+";");
                                    overWrite.print(store[j].getLast()+";");
                                    overWrite.print(store[j].getStreet()+";");
                                    overWrite.print(store[j].getCity()+";");
                                    overWrite.print(store[j].getState()+";");
                                    overWrite.print(store[j].getZip()+";");
                                    overWrite.println(store[j].getId());
                                    store[j] = null;
                                    overWrite.flush();
                                    break;
                                }
                            }   
                        }
                        tmpFile = !tmpFile;
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }

                    lock.notifyAll();
                    System.out.println("Saved");
                    try {
                        lock.wait();
                        Thread.sleep(60000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    };

Я знаю, что он достигает цикла for, где я беру все элементы из store[] и записываю их в файл, и выводит правильные данные на консоль. Однако каждый раз, когда он изменяет либо NAIList.txt, либо NAIList.tmp, он просто делает их полностью пустыми. Я понятия не имею, почему он не работает, так как код по сути скопирован из другого метода, запущенного в главном потоке, который работал так, как я хотел.

Ах, забыл добавить, что в качестве искусственного ограничения, которое дал нам мой учитель, нам разрешено иметь только десять NameAddressID объекты в оперативной памяти в любой момент времени.

РЕДАКТИРОВАТЬ: Исправлен код, единственное, что изменилось, это overWrite.flush(); был добавлен дважды

1 ответ

Решение

Вам не нужно очищать PrintWriter?

См. Javadoc конструктора PrintWriter:

Создает новый PrintWriter, без автоматической очистки строки, с указанным файлом. Этот удобный конструктор создает необходимый промежуточный OutputStreamWriter, который будет кодировать символы, используя набор символов по умолчанию для этого экземпляра виртуальной машины Java.

Другие вопросы по тегам