实际问题将进一步解决:),谢谢
我对Java还相当陌生(几乎读完了一本400页的书)。
我对API还不是很熟悉。
这是我读取.txt文件并检查.txt文件中是否已经存储了任何收集的数据的最佳方法。如果是这种情况,数据将从数据集合中删除,并添加尚未在.txt中找到的数据。
一些变量:
public String[] names;
public int[] levels;
public int[] IDs;
public ArrayList<String> line = new ArrayList<String>();
public ArrayList<RSNPC> monsterList = new ArrayList<RSNPC>();
public ArrayList<String> monstersToAdd = new ArrayList<String>();
检查现有.txt文件的方法:
private void checkForLine() {
try{
// Create file
File file = new File(getCacheDirectory() + "output.txt");
RandomAccessFile out = new RandomAccessFile(file, "rw");
for(int i = 0; i < file.length(); i++){
line.add(out.readLine());
}
for(String monster : monstersToAdd){
if(line.contains(monster)){
monstersToAdd.remove(monster);
}
}
//Close the output stream
out.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
然后最终保存checkForLine()定义的信息(文件中已经没有的信息)的方法:
private void saveToFile() {
try{
// Create file
BufferedWriter out = new BufferedWriter(new FileWriter(getCacheDirectory() + "output.txt"));
for(String a : monstersToAdd){
out.write(a);
out.newLine();
log("Wrote " + a + "to file");
}
//Close the output stream
out.close();
}catch (Exception e){//Catch exception if any
System.err.println("Error: " + e.getMessage());
}
}
执行顺序:
getNPCS();
getNames(monsterList);
getLevels(monsterList);
getIDs(monsterList);
combineInfo();
checkForLine();
saveToFile();
然而,的问题是它没有正确检查.txt文件中的信息。我能看到这一点,因为它只是一次又一次地保存它观察到的东西,而不是把任何东西都分类掉。这是我在有限的知识下唯一能想到的方法,但没有奏效
对于那些想知道的人:这是一个名为RSbot的机器人的脚本,该机器人玩名为RuneScape的游戏。我实际上并没有使用机器人,但我想这样做是为了练习。
如果能进一步澄清问题的话,我可以粘贴整个脚本。
我真的很感激任何帮助,当然也会记得选择我使用的答案(如果有人愿意帮忙;)。
谢谢。
for(String monster : monstersToAdd){
if(line.contains(monster)){
monstersToAdd.remove(monster);
}
}
如果line.contains(monster)
是true
并且monstersToAdd
包含monster
,则将抛出ConcurrentModificationException
。在迭代时从集合中删除元素的唯一安全方法是使用Iterator
:
for(Iterator<String> iter = monstersToAdd.iterator(); iter.hasNext();){
String monster = iter.next();
if (line.contains(monster)) iter.remove();
}
编辑
@真实性指出
实际上,实现同样目的的一种简单得多的方法是
monstersToAdd.removeAll(line);
因此,您可以用一行代码替换for
循环。
一个可能的问题是,当您"保存"时,似乎覆盖了同一个文件。我建议进行一次测试运行,从一个文件读取并写入另一个文件。
为了附加到文件,您有几个选项:
- 让你的两个函数共享"RandomAccessFile",这样在第一个函数读取完文件后,光标就在文件的末尾,第二个函数就可以从那里开始写入,并附加到文件中
- 在第二个函数中打开
RandomAccessFile
,并在写入之前将光标移动到文件的末尾(例如,读取文件中的所有内容,直到没有更多行为止)