BufferedReader: чтение нескольких строк в одну строку - PullRequest
12 голосов
/ 01 апреля 2011

Я читаю числа из текстового файла, используя 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.
    }
}

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

Идеи приветствуются, спасибо.

Ответы [ 7 ]

26 голосов
/ 01 апреля 2011

Вы правы, здесь потребуется петля.

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

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

3 голосов
/ 29 июня 2016

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

2 голосов
/ 01 апреля 2011

Если вы просто хотите прочитать весь файл в строку, я предлагаю вам использовать Гуава 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);
1 голос
/ 01 апреля 2011

Звучит так, как вы хотите Apache IO FileUtils

String text = FileUtils.readStringFromFile(new File(filename + ".txt"));
String[] stringArray = text.split("[^0-9.+Ee-]+");
0 голосов
/ 01 апреля 2011

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

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

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

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

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

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

0 голосов
/ 01 апреля 2011

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

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


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

    return line.toString();
}
0 голосов
/ 01 апреля 2011

Если вы создаете 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...