【发布时间】:2016-03-31 14:58:24
【问题描述】:
我正在尝试使用一个专用线程来定期覆盖文件,以便文件中唯一实际更改的内容是我在 GUI 中更改的内容。以下是相关代码:
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,它只会使它们完全空白。我不知道为什么它不起作用,因为代码本质上是从在主线程上运行的不同方法复制而来的,它确实按我的意愿工作。
啊,忘了补充,作为我老师给我们的人为限制,在任何给定时间,我们只能在 RAM 中拥有十个 NameAddressID 对象。
编辑:固定代码,唯一改变的是overWrite.flush();被添加了两次
【问题讨论】:
-
首先尝试将您的代码分成逻辑单元。您可以将参数传递给
Runnable的实现,您知道...而且,Java 具有锁定对象,这可能会有所帮助。简而言之:分而治之。事实上,你的代码几乎无法管理,但我相信我什至不需要告诉你。 -
每次完成编辑时刷新流。
-
啊,我错了,我现在试试
标签: java multithreading writetofile