【发布时间】:2014-09-20 20:30:03
【问题描述】:
我对 java 还很陌生,我基本上是在编写一个键盘记录器,并让它定期写入文件。每次用户按下一个键时,它都会实例化一个调用“paramString()”的 NativeKeyEvent,并将信息作为字符串添加到下面的数组列表中......
public static ArrayList<String> stringArray = new ArrayList<String>();
public synchronized String paramString() {
StringBuilder param = new StringBuilder(255);
// other code
stringArray.add(param.toString());
}
然后在每个间隔传递字符串数组,并在下面的 TimerTask 线程中写入文件...
public class SaveToArrayAndWriteTask extends TimerTask {
private ArrayList<String> anotherArray = NativeKeyEvent.stringArray;
private static String str;
@Override
public synchronized void run() {
openFile();
writeToFile(anotherArray);
closeFile();
}
private static synchronized void writeToFile(ArrayList<String> localArray) {
Iterator<String> iterator = localArray.iterator();
try {
while (iterator.hasNext()) {
str = iterator.next().toString();
output.format("%s\n", str);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
行'str = iterator.next().toString();'如果在程序记录/添加另一个击键时尝试遍历 arraylist 以将其写入文件,则抛出异常。我认为通过将 stringArray (正在修改)放入 anotherArray 并将其作为参数传递可以阻止这种情况的发生。如您所见,我尝试使用 synchronized 关键字,也尝试将其放入另一个线程并阅读了有关 stackoverflow 的各种其他帖子,但无济于事。
解决此问题的最佳方法是什么?
【问题讨论】:
标签: java exception arraylist concurrency iterator