#java #bufferedreader
#java #bufferedreader
Вопрос:
Я хочу прочитать следующее в TimeEntry
с BufferedReader
помощью.
Date: 11.10.2016
start: 09:00
я знаю, как преобразовать String
в LocalDate
, но я понятия не имею, как использовать это в моем коде с BufferedReader
Я думаю, мне это нужно:
Pattern p = Pattern.compile(
" * Date:*(\d\ d)\ .(\d\d)\ .(\d\d\d\d) *"
);
public class TimeEntry {
private LocalDate date;
private LocalTime start;
public TimeEntry(LocalDate date, LocalTime start) {
this.date = date;
this.start = start;
}
try {
File file = new File("MailDaten.txt");
FileReader fileReader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(fileReader);
StringBuffer stringBuffer = new StringBuffer();
String line = null;
String[] line_split = line.split(" ");
String test = line_split[0];
int s = test.split("@")[0].lastIndexOf(" ");
String name = test.substring(0,s);
String mail = test.substring(s 1,test.length());
while ((line = bufferedReader.readLine()) != null) {
line_split = line.split(" ");
Daten.add(
new MailEntry(
name, mail,
new TimeEntry(
line_split[3], line_split[3], line_split[4], line_split[5]
)
)
);
stringBuffer.append(line);
stringBuffer.append("n");
}
fileReader.close();
System.out.println("Contents of file:");
System.out.println(stringBuffer.toString());
} catch (IOException e) {
e.printStackTrace();
}
Ответ №1:
Как насчет чего-то подобного?
String input = "Date: 11.10.2016rn"
"start: 09:00rn";
try (BufferedReader in = new BufferedReader(new StringReader(input))) {
String dateLine = in.readLine();
String startLine = in.readLine();
if (! dateLine.matches("Date: \d{2}\.\d{2}\.\d{4}"))
throw new IllegalArgumentException("Invalid date line: " dateLine);
if (! startLine.matches("start: \d{2}:\d{2}"))
throw new IllegalArgumentException("Invalid start line: " startLine);
LocalDate date = LocalDate.parse(dateLine.substring(6), DateTimeFormatter.ofPattern("dd.MM.uuuu"));
LocalTime start = LocalTime.parse(startLine.substring(7), DateTimeFormatter.ofPattern("HH:mm"));
LocalDateTime dateStart = LocalDateTime.of(date, start);
System.out.println(dateStart); // prints: 2016-10-11T09:00
}
Комментарии:
1. Вам следует избегать вызова
String#matches(regex)
в цикле, поскольку он будет перекомпилировать регулярное выражение при каждом вызове, что является дорогостоящим2. @NicolasFilotto Верно. По той же причине код не должен создавать
DateTimeFormatter
объекты внутри цикла. — О, подождите. В моем коде нет цикла.3. ах да, это верно, это настолько необычно для использования
BufferedReader
без потока или цикла, что я пропустил, что мой плохой4. @NicolasFilotto Я согласен,
BufferedReader
подразумевает цикл . Я написал комментарий для вас и был готов нажать Enter, когда понял, что цикла нет. Я написал код, и это заняло у меня столько времени. 😉