Чтение файла, содержащего несколько записей, и вывод одной записи на основе пользовательского ввода

#java #file #for-loop

#java #файл #for-цикл

Вопрос:

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

The_txt.txt

Энтони

anthonyk@somewhere.com

01234567891

Расположение


Мария

maria@somewhere.com

1234561234

location2


Джордж

george@somewhere.com

1234512345

location3


Что я хочу сделать с этим текстом, так это то, что я предлагаю пользователю ввести номер телефона, поэтому, если, например, пользователь предоставит номер телефона Марии (1234561234), программа выведет

Мария

maria@somewhere.com

1234561234

location2

Мой фрагмент кода для этой задачи :

     private static void Search_Contact_By_Phone(File file_location){

        Scanner To_Be_String = new Scanner(System.in);

        String To_Be_Searched = To_Be_String.nextLine();

        System.out.println("n n n");

        BufferedReader Search_Phone_reader;
        try {
            Search_Phone_reader = new BufferedReader(new FileReader (file_location));
            String new_line = Search_Phone_reader.readLine();
            while (new_line != null) {
                if (To_Be_Searched.equals(new_line)){
                    for (int i=0;i<=3;i  ){
                        System.out.println(new_line);
                        new_line = Search_Phone_reader.readLine();
                    }
                    break;
                }
                new_line = Search_Phone_reader.readLine();
            }
            Search_Phone_reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  

Заранее благодарю вас!!!

Комментарии:

1. Должна ли ваша программа выполнять поиск по номеру или по любой строке? Есть ли у вас какие-либо разделители между вашими пользователями?

2. У меня есть еще одна пустота для поиска по имени, но я это сделал. Моя проблема заключается в поиске по номеру телефона. Нет, у меня нет никаких разделителей, если он учитывается каждый раз, когда новый пользователь добавляется в текст, добавляемый программой _____________________ и n после каждого добавления

3. Вы должны следовать соглашениям об именовании Java: имена переменных и имена методов записываются в camelCase. Например, To_Be_String должно быть toBeString .

4. Да, это может быть delimeter. В любом случае, вы можете разделить своего пользователя с помощью регулярного выражения, подобного этому: имя — только буквы, почта-состоит из @, номер — только цифры, а местоположение — только буквы с номером в конце. Итак, когда вы вводите какую-либо строку в Scanner, вы должны выполнить поиск в своем первом delimeter ______n перед и начать добавлять полного пользователя в строку [] .

5. О, я полагаю, вы можете добавить в свою строку [] user каждую строку до delimeter, если вы ищете строку, найденную в массиве, вы показываете этого пользователя, если нет, вы удаляете []user и воссоздаете. Таким образом, на каждой итерации у вас будет 4 строки в массиве, и вы проверяете их по введенной строке

Ответ №1:

 package com.mycompany.io;

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

public class Main {
  public static void main(String[] args) throws IOException {
    // For a small file
    Path path = Paths.get("The_txt.txt");
    String toBeSearched = "1234512345";
    List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
    // Better performance if i starts at 2 and i  = 4
    for (int i = 0; i < lines.size(); i  ) {
      if (lines.get(i).equals(toBeSearched)) {
        System.out.println(lines.get(i - 2));
        System.out.println(lines.get(i - 1));
        System.out.println(lines.get(i));
        System.out.println(lines.get(i   1));
      }
    }
    // Else
    try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
      String line1;
      while ((line1 = reader.readLine()) != null) {
        String line2 = reader.readLine();
        String line3 = reader.readLine();
        if (line3.equals(toBeSearched)) {
          // Found
          System.out.println(line1);
          System.out.println(line2);
          System.out.println(line3);
          System.out.println(reader.readLine());
          break;
        } else {
          reader.readLine();
        }
      }
    }
  }
}
  

Комментарии:

1. Как вы можете сделать lines.get(i-1) , если вы не уверены, что он существует?

2. Если формат файла хороший, он должен существовать из-за теста в «если». Мой код — это просто быстрый код, который можно изменить по вашему желанию. Я забыл закрыть поток, мне нужно уйти сейчас, но я скоро добавлю его.