прочитать LocalDate с помощью bufferedreader — java

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