Командой bufferedreader и возвращает значение null, без видимых причин



И заранее спасибо за помощь. Я довольно новичок в Java и не имел никакого формального образования Java. Я делаю сервер Minecraft Bukkit для практики и регистрирую местоположения знаков в файле при создании. Я пытаюсь сделать логическое значение, которое возвращает true, если расположение файла и false в противном случае. Я не могу использовать цикл while или он зависает сервер, поэтому я использую цикл for. В любом случае, все строки, которые возвращает BufferedReader, равны нулю, и я не знаю, почему. Я есть целое число, которое возвращает количество строк в файле с помощью BufferedReader, который работает нормально. Я не понимаю, почему он возвращает null с логическим значением. Вот булево выражение:



Блок Кода:



    private boolean isDuplicate(String in) throws IOException
{
File f = file;
try {
fr = new FileReader(f);
br = new BufferedReader(fr);
} catch (FileNotFoundException e1) {
log(Level.WARNING, "File not found.");
}
String temp;
in = in.substring(0,in.length() - 1);
for(int i = 0; i < (countLines(f)); i++)
{
if((temp = br.readLine()) != null)
{
String s = temp;
log(temp);
}
}
return false;
}


Вот целое число:



    private int countLines(File f){
try {
fr = new FileReader(f);
br = new BufferedReader(fr);
} catch (FileNotFoundException e1) {
log(Level.WARNING, "File not found!");
}

for(int i = 0; i < 100000; i++)
{
try
{
if(br.readLine() == null)
{
return i;
}
}
catch (NullPointerException e)
{
return i;
}
catch (IOException e)
{

}
}
return 0;
}
755   3  

3 ответов:

"очевидная причина" заключается в том, что вы достигли конца файла. Но этот код-чепуха. Вам не нужно считать строки заранее вообще, и вам, конечно, не нужно считать их каждый раз вокруг цикла, что и делает ваш текущий код. В настоящее время ваша обработка O(N2), а это уже катастрофа. Просто вызывайте readLine(), пока он не вернет null:

while ((line = br.readLine()) != null)
{
    // ...
    log(line);
}

NB нет способа, чтобы ваш isDuplicate() Метод делал что-либо, хотя бы немного напоминающее его имя.

Есть довольно много проблем с этим кодом (наиболее вопиющие: когда вы поймаете "FileNotFound", вы должны вернуться и записать "фатальный" - нет смысла продолжать). Я также предполагаю, что ваш фактический код не тот, который вы показываете (он не будет компилироваться).

В любом случае, вот как Вы читаете файл в Java:

public boolean isDuplicate(String lookup, String filename) {
    try {
        BufferedReader reader = new BufferedReader(new FileReader(filename));
        String line;
        int lineNo = 0;
        while ((line = reader.readLine()) != null) {
            lineNo++;
            // best would be to use a regex to match against the line
            // however, the naive approach would be
            if (line.indexOf(lookup) != -1) {
                log.info(String.format"Lookup term %s found on line %d", lookup, lineNo);
                return true;
            }
        }
        log.info(String.format("Lookup term %s not found in %s", lookup, filename);
        return false;
    } catch (IOException e) {
        // log a fatal error and bail
        log.error(String.format("Could not read from %s [%s]", filename, e.getLocalizedMessage()));
        // here best practice would be to throw your own custom application ex
        throw new MyApplicationException(e);
    }
}

while и for ведут себя по существу одинаково; причина, по которой ваш while никогда не "возвращался", вероятно, связана с вашим "исчерпанием" потока в countlines() метод.

Во-первых, вам не нужна функция countLines или цикл for, который ее использует. Вы можете заменить утверждение if на

while((temp = br.readLine()) != null)

Во-вторых, countLines использует глобальный bufferedReader и, вероятно, закончил чтение всего файла. Любой новый БР.readLine () отныне будет возвращать null. Следовательно, когда вы возвращаетесь из функции countlines и пытаетесь сделать br.readLine (), вы получаете нулевое значение.

Comments

    Ничего не найдено.