readLine для чтения нескольких строк без цикла?

1

Поэтому мой сервлет читает ссылку url из другого сервлета, а затем публикует связанную с ним статью. Все статьи находятся в одном файле.txt с каждой статьей в отдельной отдельной строке. Поэтому я правильно применил первую ссылку URL-адреса, но я не могу заставить вторую работать правильно. Проблема в том, что я использую цикл, подобный while( br.readline() != null) тогда он отобразит все 3 статьи, а не только статью, на которую я нажал. Когда я не зацикливаю его и просто использую br.readline() он останавливается в первой строке и не переходит ко второй строке, как мне нужно, если я прошу URL 2 или URL 3. Вот мой код:

s = br.readLine();
    out.println("<tr>");
    StringTokenizer s2 = new StringTokenizer(s, "|");
    if (request.getParameter("article1") != null){
        while (s2.hasMoreElements()){
            if (index == 0){
                out.println("<td class='first'>"+s2.nextElement()+"</td>");
            }
            else if (index == 1){
                out.println("<td>"+s2.nextElement()+"</td>");
            }
            else if (index == 2){
                out.println("<td>"+s2.nextElement()+"</td>");
            }
            else if (index == 3){
                out.println("<td>"+s2.nextElement()+"</td>");
            }
            index++;
            out.println("</tr>");
        }
    }
    else if (request.getParameter("article2") != null){
    s = br.readLine();
        while (s2.hasMoreElements()){
            if (index == 4{
                out.println("<td class='first'>"+s2.nextElement()+"</td>");
            }
            else if (index == 5){
                out.println("<td>"+s2.nextElement()+"</td>");
            }
            else if (index == 6){
                out.println("<td>"+s2.nextElement()+"</td>");
            }
            else if (index == 7){
                out.println("<td>"+s2.nextElement()+"</td>");
            }
            index ++;
            out.println("</tr>");
        }

Я знаю, что это, вероятно, просто глупая ошибка кодирования, которую я не вижу, потому что я смотрел на нее так долго, но я не могу заставить ее делать то, что я хочу. Также я не показывал код статьи 3, потому что он по сути тот же, и если я могу исправить код статьи 2, то статья 3 будет в основном такой же.

Теги:
java-ee

3 ответа

2
Лучший ответ

Я настоятельно рекомендую вам выделить "чтение данных" из разделов "вывод HTML" вашего кода.

Похоже, вы должны создать структуру данных для статьи со свойствами для любых разных бит в каждой строке. Вы можете:

  • Создать List<Article>
  • Прочитайте строку за раз
    • Разбирайте строку как Article (например, путем разделения в соответствии с вашим кодом)
    • Добавить каждую Article в список

Теперь у вас есть List<Article> который вы можете использовать любым способом, который вам нравится, в части вашего кода, которая должна выводить HTML. Вам не нужно беспокоиться о смешении чтения строк и синтаксического анализа с кодом вывода. Это должно сделать все гораздо проще в обращении.

0

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

int wantedLineNr = 4;
String currentLine = null;
int lineCounter = 0;
while ((currentLine = br.readLine()) != null) { 

    lineCounter ++;
    if(lineCounter == wantedLineNr){

       // the line is reached so execute the necessary code and exit the loop
       break;
    }
}
0

Я не думаю, что это прекрасный способ сделать что-то, но если вы просто хотите это сделать, вызовите br.readLine внутри блоков if, когда вы знаете, сколько строк вы должны отбросить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню