BufferedReader: чтение нескольких строк в одну строку

Я читаю числа из txt файла, используя BufferedReader для анализа. То, как я сейчас это делаю, - чтение строки с использованием .readline, разделение этой строки на массив строк с использованием .split

public InputFile () {
    fileIn = null;

    //stuff here

    fileIn = new FileReader((filename + ".txt"));
    buffIn = new BufferedReader(fileIn);


    return;
    //stuff here
}

public String ReadBigStringIn() {
    String line = null;

    try { line = buffIn.readLine(); }
    catch(IOException e){};

    return line;
}

public ProcessMain() {
    initComponents();
    String[] stringArray;
    String line;

    try {
        InputFile stringIn = new InputFile();
        line = stringIn.ReadBigStringIn();
        stringArray = line.split("[^0-9.+Ee-]+"); 
        // analysis etc.
    }
}

Это прекрасно работает, но что, если txt файл имеет несколько строк текста? Есть ли способ вывести одну длинную строку или, возможно, другой способ сделать это? Может быть, использовать while(buffIn.readline != null) {}? Не знаете, как это реализовать.

Идеи оценены, спасибо.

Ответ 1

Вы правы, здесь понадобится цикл.

Обычная идиома (с использованием только простой Java) выглядит примерно так:

public String ReadBigStringIn(BufferedReader buffIn) throws IOException {
    StringBuilder everything = new StringBuilder();
    String line;
    while( (line = buffIn.readLine()) != null) {
       everything.append(line);
    }
    return everything.toString();
}

Это удаляет разрывы строк - если вы хотите их сохранить, не используйте метод readLine(), а просто вместо этого переходите в char[] (и добавляете это в свой StringBuilder).

Ответ 2

Если вы просто хотите прочитать весь файл в строке, я предлагаю вам использовать Guava Files класс:

String text = Files.toString("filename.txt", Charsets.UTF_8);

Конечно, предполагается, что вы хотите поддерживать разрывы строк. Если вы хотите удалить строки, вы можете либо загрузить его таким образом, а затем использовать String.replace, или вы можете снова использовать Guava:

List<String> lines = Files.readLines(new File("filename.txt"), Charsets.UTF_8);
String joined = Joiner.on("").join(lines);

Ответ 3

Похоже, вы хотите, чтобы Apache IO FileUtils

String text = FileUtils.readStringFromFile(new File(filename + ".txt"));
String[] stringArray = text.split("[^0-9.+Ee-]+");

Ответ 4

Если вы создаете StringBuilder, вы можете добавить каждую строку к нему и вернуть строку с помощью toString() в конце.

Вы можете заменить ReadBigStringIn() на

public String ReadBigStringIn() {
        StringBuilder b = new StringBuilder();

        try {
            String line = buffIn.readLine();
            while (line != null) {
                b.append(line);
                line = buffIn.readLine();
            }
        }
        catch(IOException e){};

        return b.toString();
}

Ответ 5

Это создает длинную строку, каждая строка отделяется от строки "" (одно пространство):

public String ReadBigStringIn() {
    StringBuffer line = new StringBuffer();


    try { 
        while(buffIn.ready()) {
        line.append(" " + buffIn.readLine());
    } catch(IOException e){
        e.printStackTrace();
    }

    return line.toString();
}

Ответ 6

У вас есть файл, содержащий парные. Похоже, у вас более одного номера в строке и может иметь несколько строк.

Проще всего сделать, это прочитать строки в цикле while.

Вы можете вернуть null из метода ReadBigStringIn, когда будет достигнута последняя строка, и завершите свой цикл там.

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

Кстати, не могли бы вы просто разделить строки на пробелы?

Чтение всего файла в одну строку может соответствовать вашему конкретному случаю, но имейте в виду, что это может привести к взрыву памяти, если ваш файл был очень большим. Потоковый подход, как правило, более безопасен для таких i/o.

Ответ 7

Я бы настоятельно советовал использовать библиотеку здесь, но с Java 8 вы также можете использовать потоки.

    try (InputStreamReader in = new InputStreamReader(System.in);
         BufferedReader buffer = new BufferedReader(in)) {
        final String fileAsText = buffer.lines().collect(Collectors.joining());
        System.out.println(fileAsText);
    } catch (Exception e) {
        e.printStackTrace();
    }

Вы также можете заметить, что это довольно эффективно, поскольку joining использует StringBuilder внутренне.