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
внутренне.