1

我遇到了这个非常烦人的错误。我已经为此工作了好几天,并且进行了大量的研究,但没有成功。基本上,代码在做什么,是读取文件,但似乎在读取文件后删除了文本。而且只有某些行。这是我的阅读器方法:

synchronized public static String getValue(String path, String filename, Boolean useColors, String folder){
    try{
        while(!TxtWriter.isResting());
        FileRequest req =  writer.getRelitive(filename, path);
        if(req==null){
            File f = new File(Conquest.FilePaths+"/"+folder, filename);
            if(!f.getParentFile().exists())f.getParentFile().mkdirs();
            if(f.exists()){
                BufferedReader in = new BufferedReader(new FileReader(f));
                String a;
                while((a=in.readLine())!=null){
                    if(a.startsWith("'"+path+"'"+":")){
                        in.close();
                        a=a.substring(path.length()+3);
                        if(useColors)a=colorCoder(a);
                        return a;
                    }
                }
                in.close();
            }else TxtWriter.createFile(filename, folder);
        }else return ((useColors)?colorCoder(req.getMessage()):req.getMessage());
    }catch(Exception e){
        System.err.println("[Conquest/TxtReader] Error reading file "+filename+"!");
        e.printStackTrace();
    }
    return null;
}

这是阅读前的文件:

'Kingdom':Devonel

'Flags':Leader

我调用方法

public String getPlayerKingdom(String p){
    String in = TxtReader.getValue("Kingdom", p+".txt", false, "Citizens");
    return ((in==null)?in:"None");
}

它返回“None”,文件现在只有'Flags':Leader,没有别的了。

真正让我感到困惑的是,某些方法有效,而其他方法则无效。即使它们是完全相同的代码,但具有不同的字符串。这个方法在这里是一样的,但它的工作原理和它应该的一样。

public int getResource(String kingdom, String name){
    String out = TxtReader.getValue("R-" + name, kingdom + ".txt", false, "Kingdoms");
    if(out==null)return 0;
    return Integer.valueOf(out);
}

如果有人可以提供帮助,我将不胜感激。:)

4

1 回答 1

3

这一行看起来不对:

return ((in==null)?in:"None");

不应该反过来吗?

return ((in==null)?"None":in);

出于这个原因,我不喜欢三元运算符构造。只需使用 if/else 块并清楚您在做什么。

此外,BufferedReader 不会从文件中删除信息。时期。它只是读取信息,没有别的。如果要删除一行,则程序中可能存在另一个错误,可能是在未显示的代码中导致此错误。

但无论错误的来源是什么,您的代码看起来都非常低效且容易出错。为什么每次需要检查匹配项时都尝试重新读取文件?为什么不简单地读取文件一次,然后将信息存储在一个HashMap<String, String>?

于 2012-08-20T02:35:07.797 回答