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

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

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) {}? Не уверен, как реализовать этот.

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

7 ответов


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

обычная идиома (используя только простой 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).

обратите внимание, что этот цикл будет работать до конца потока (и будет блокировать, если он не закончится), поэтому, если вам нужно другое условие, чтобы закончить loop, реализуйте его там.


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

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

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

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

Я бы настоятельно рекомендовал использовать библиотеку здесь, но с 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 внутренне.


звучит так, как будто вы хотите Apache Io FileUtils

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

при создании 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();
}

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

самое простое, что нужно сделать, это прочитать строки в цикле while.

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

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

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

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


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

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


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

    return line.toString();
}