Командой 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;
}
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