Чтение в текстовом файле на Java - PullRequest
1 голос
/ 31 декабря 2011

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

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
}

Ответы [ 4 ]

2 голосов
/ 31 декабря 2011

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

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

1 голос
/ 31 декабря 2011

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

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

1 голос
/ 31 декабря 2011

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

Также:

  • не предполагайте, что файл содержит строку.Вы не должны использовать цикл do / while, а скорее цикл while;
  • всегда закрывает потоки, программы чтения и записи в блоке finally;
  • catch (Exception) - плохая практика.Только ловить исключения, которые вы хотите, и можете обрабатывать.Иначе, пусть они поднимутся в стек.
0 голосов
/ 31 декабря 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...