Чтение в текстовом файле в Java

Я написал некоторый код для чтения в текстовом файле и для возврата массива с каждой строкой, хранящейся в элементе. Я не могу в жизни понять, почему это не работает ... может ли кто-нибудь быстро взглянуть? Вывод из System.out.println(line); имеет значение null, поэтому я предполагаю, что есть проблема с чтением строки, но я не понимаю, почему. Кстати, в файле, который я ему передаю, определенно что-то есть!

public InOutSys(String filename) {
    try {
        file = new File(filename);
        br = new BufferedReader(new FileReader(file));
        bw = new BufferedWriter(new FileWriter(file));
    } catch (Exception e) {
        e.printStackTrace();
    }
}



public String[] readFile() { 

    ArrayList<String> dataList = new ArrayList<String>();   // use ArrayList because it can expand automatically
    try {
        String line;

        // Read in lines of the document until you read a null line
        do {
            line = br.readLine();
            System.out.println(line);
            dataList.add(line);
        } while (line != null && !line.isEmpty());
        br.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

    //  Convert the ArrayList into an Array
    String[] dataArr = new String[dataList.size()];
    dataArr = dataList.toArray(dataArr);

    // Test
    for (String s : dataArr)
        System.out.println(s);

    return dataArr; // Returns an array containing the separate lines of the
    // file
}

person user1058210    schedule 31.12.2011    source источник
comment
Вы уверены, что с файлом все в порядке? Вы ищете файл в правильном месте (относительно директории пользователя)?   -  person Hovercraft Full Of Eels    schedule 31.12.2011
comment
Где объявлен файл /br/bw? InOutSys и readFile публичны, но второй закрывает бр. Как избежать вызова readFile для закрытого br?   -  person user unknown    schedule 31.12.2011


Ответы (4)


Во-первых, вы открываете FileWriter один раз после открытия FileReader, используя новый FileWriter(файл), который открывает файл в режиме создания. Так что это будет пустой файл после запуска вашей программы.

Во-вторых, есть ли в вашем файле пустая строка? если это так, !line.isEmpty() завершит ваш цикл do-while.

person julian0zzx    schedule 31.12.2011

Вы используете FileWriter для файла, который вы читаете, поэтому FileWriter очищает содержимое файла. Не читайте и не записывайте в один и тот же файл одновременно.

Также:

  • не предполагайте, что файл содержит строку. Вы не должны использовать цикл do/while, а цикл while;
  • всегда объединяйте пары, читателей и писателей в блок finally;
  • catch(Exception) — плохая практика. Перехватывайте только те исключения, которые вы хотите и можете обработать. В противном случае, пусть они идут вверх по стеку.
person JB Nizet    schedule 31.12.2011

Я не уверен, ищете ли вы способ улучшить предоставленный код или просто решение для «Чтения в текстовом файле на Java», как сказано в заголовке, но если вы ищете решение, я бы рекомендовал используя apache commons io, чтобы сделать это за вас. readLines метод из FileUtils подойдет точно что вы хотите.

Если вы хотите учиться на хорошем примере, FileUtils имеет открытый исходный код, поэтому вы можете посмотреть, как они решили его реализовать, на просмотр исходного кода.

person user605331    schedule 31.12.2011

Есть несколько возможных причин вашей проблемы:

  • Неверный путь к файлу
  • Вы не должны пытаться читать/записывать один и тот же файл одновременно
  • Не очень хорошая идея инициализировать буферы в конструкторе, подумайте об этом - какой-то метод может закрыть буфер, сделав его недействительным для последующих вызовов того или иного метода.
  • Неверное условие цикла

Лучше попробуйте этот подход для чтения:

try {
    String line = null;
    BufferedReader br = new BufferedReader(new FileReader(file));
    while ((line = br.readLine()) != null) {
        System.out.println(line);
        dataList.add(line);
    }
} finally {
    if (br != null)
        br.close();
}
person Óscar López    schedule 31.12.2011