Запись в текстовый файл при использовании многопоточности
Я пытаюсь создать отдельный поток, который периодически перезаписывает файл, так что единственное, что на самом деле изменяется в файле, это то, что я изменил в графическом интерфейсе. Вот соответствующий код:
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.