2016-12-13 4 views
-1

Я пытаюсь дать пользователю свой ежедневный гороскоп. У меня есть большой текстовый файл, который выглядит примерно так:Использование BufferedReader для чтения абзаца из текстового файла

Овен

Там просто не бывает скучно, когда вы вокруг [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [конец].

Телец

Попадая в [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [продолжить гороскоп] [конец].

Этот текстовый файл содержит все гороскопы для всех знаков зодиака. Я пытаюсь распечатать правильный абзац на основе ввода пользователя. Может кто-нибудь, пожалуйста, помогите мне с этим? Это то, что у меня есть до сих пор:

public static void getDailyHoroscope() throws IOException{ 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Please input your zodiac sign:"); 
    String sign = sc.nextLine(); 
    String file = ".txt file"; 

    try { 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 

     while ((line = br.readLine()) != null) { 
      System.out.print(line); 
     } 
     br.close(); 
    } 
    catch(FileNotFoundException e) { 
     System.out.println("Cannot find" + file); 
} 

Я не уверен, как действовать. Это только выплескивает весь текстовый файл в консоли. Я хочу разделить вывод на параграфы на основе знака пользователя.

+0

Один файл содержит все зодиакальные имена? aries, taurus .... ' – toto

+1

Что вы на самом деле пытались? Это код для чтения и печати текстового файла. Каковы ваши идеи о том, как распечатать только ту часть, которая вам нужна? –

+0

Исправьте свою закрывающую фигурку на обработчике исключений. Кроме того, рассмотрите возможность использования try-in-resources: 'try (BufferedReader br = new BufferedReader (новый FileReader (файл))) {'. –

ответ

-1

УПРАЖНЕНИЕ:

Scanner sc = new Scanner(System.in); 
     System.out.println("Please input your zodiac sign:"); 
     String sign = sc.nextLine(); 
     String file = ".txt file"; 

     try { 
      BufferedReader br = new BufferedReader(new FileReader(file)); 
      String line; 

      String sign2 = ""; 
      String content = ""; 
      String nl = System.getProperty("line.separator"); 
      //I assummed that your text not end with [end] for each sign zodiac. 
      while ((line = br.readLine()) != null) { 
       String l = line.trim().toLowerCase(); 
       //Check if line is equal than some zodiac sign. 
       String sign3 = ""; 
       if (l.equals("aries")) { 
        sign3 = "aries"; 
       } else if (l.equals("tauro")) { 
        sign3 = "tauro"; 
       } //complete here all zodiac sing with else if. 

       //Check if sign is equal than sign enter by user and data content for this sign still not ready. 
       if (sign2.length() == 0 && sign3.length() != 0 && sign.toLowerCase().equals(sign3)) { 
        sign2 = sign3; 
       } else { 
        //Check if we need concatenate data for this sign. 
        if (sign2.length() > 0 && sign3.length() == 0) { 
         content += line + nl; 
        } else { 
         //If this line is equal other sign and content data we finalized and break. 
         if (sign2.length() > 0 && sign3.length() != 0) { 
          break; 
         } 
        } 
       } 

      } 
      br.close(); 

      System.out.println(content); 
     } catch (Exception ex) { 
      System.out.println("Cannot find" + file); 
     } 
+1

Кодовые ответы редко так желательны. Подумайте о том, чтобы добавить объяснение, почему он должен работать для OP. – rafid059

2

Похоже, вы много работаете.

В вашем случае это может быть идея товара, чтобы сначала прочитать весь файл, разделить его на абзацы, сохранить его в какую-нибудь коллекцию, например Map<Sign, Paragraph> или Set<Paragraph>, а затем просто просмотреть эту коллекцию для записи, которая необходима.

0

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

Нечто подобное может работать:

public static void getDailyHoroscope() throws IOException{ 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Please input your zodiac sign:"); 
    String sign = sc.nextLine(); 
    String file = ".txt file"; 

    try { 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 
     boolean print = false; 
     while ((line = br.readLine()) != null) { 
      //If our print flag is false and we found a line that's just our users's sign 
      if((!print) && line.trim().equalsIgnoreCase(sign)){ 
       //set our print flag to true 
       print = true; 
      } 
      if(print){ 
       //if we're printing, and the line we just read was completley empty, unset our print flag. 
       if(line.trim().isEmpty()){ 
        print = false; 
       } 
       System.out.println(line); 
      } 
     } 
     br.close(); 
    }catch(FileNotFoundException e) { 
     System.out.println("Cannot find" + file); 
    } 
} 

Имейте в виду, я написал это в блокноте, может не работать.

Некоторые соображения, рассматривающие ваше сообщение выше: В текущем состоянии этого кода, если он вообще работает вообще, он, вероятно, напечатает только имя гороскопа, а затем ударит пустую строку и прекратит печать, вам нужно будет учитывать это возможность.

0
public static void getDailyHoroscope() throws IOException{ 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Please input your zodiac sign:"); 
    String sign = sc.nextLine(); 
    String file = "C:/Users/Laptop/Downloads/horoscope.txt"; 
    sc.close(); 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 
     //include boolean exist sign, only because message 
     boolean existSign = false; 

     while ((line = br.readLine()) != null) { 
      if (line.equalsIgnoreCase(sign)) { 
       //skip first empty line 
       br.readLine(); 
       line = br.readLine(); 
       while (line!=null && !(line.isEmpty())) { 
        System.out.println("\n"+line); 
        line = br.readLine(); 
       } 

       existSign = true; 
       break; 
      } 
     } 
     if (!existSign) 
      System.out.println("Please input zodiac sign which exists"); 

     br.close(); 
    } catch (FileNotFoundException e) { 
     System.out.println("Cannot find" + file); 
    } 
} 

Во внешней строке цикла чтения, в то время как линия не равна знаку. В случае чтения одной строки, чтобы пропустить пустую строку, после строки чтения с полезным текстом. Пока он достигает конца или следующей пустой строки, напечатайте эту строку и прочитайте следующую строку. После внутреннего времени, установите existSign на true и нарушите внешний.

+0

Это проверенное и работающее устройство. –

+1

Я не могу представить, чтобы каждый из абзацев op буквально заканчивался '[end].', Так же как я сомневаюсь, что у всех их есть содержание '[гороскоп продолжения]' – zack6849

+0

Пожалуйста, объясните, почему это работает. Хотя код помогает много, понимание обычно требует большего, чем просто. – Flummox