Строки, потерянные при чтении файла в JTextPane

#java #swing

#java #swing

Вопрос:

Я читаю файл java в JTextPane, и некоторые строки пропускаются, и я, кажется, не могу найти, где, я думаю, мне просто нужна другая пара глаз, чтобы взглянуть на мой метод чтения.

 /**
 * Reads a File object line by line and appends its data
 * to the JTextPane. I chose to NOT use the JTextPane's read()
 * function because it creates formatting conflicts.
 *
 * @param file      The File object to read data from
 */


    public void readFileData(File file)

  {
     Scanner fileScanner = null;

     try
     {
        fileScanner = new Scanner(file);
     }
        catch(FileNotFoundException fnfe)
        {
           System.err.println(fnfe.getMessage());
        }

     while(fileScanner.hasNextLine())
     {
        String line          = fileScanner.nextLine();
        String trimmedLine = line.trim();

            //test line for potential keywords, ignore comments
        if(!trimmedLine.contains("/**") amp;amp; !trimmedLine.contains("/*") amp;amp;
           !trimmedLine.contains("//"))
        {
           boolean tst = Keywords.hasKeywords(line);
           if(tst) //keywords exist in the line, split the line up
           {
              String[] words = line.split("\s");
              for(String word : words)
              {
                 if(Keywords.isKeyword(word))
                 {
                        //copy keyword object 
                    Keywords k = map.get(word); 
                        //append keyword with proper color
                    ui.append(k.getText()   " ", k.getColor());
                 }
                 else //not a keyword append normally
                 {
                    ui.append(word   " ", Color.BLACK);
                 }
              }
              ui.append(newline);
           }
           else //if the line had no keywords, append without splitting
           {
              ui.append(line, Color.BLACK);
              ui.append(newline);
           }
        }
        else 
        {
                //create darker color, because the built-in 
                    //orange is too bright on your eyes
           Color commentColor = Color.ORANGE.darker().darker();

            //if this is the start of a multiline comment
           if(trimmedLine.startsWith("/**") || trimmedLine.startsWith("/*") )
           {
              //while not at the end of the comment block
              while(!trimmedLine.endsWith("*/"))
              {
                 //append lines
                 ui.append(line, commentColor);
                 ui.append(newline);

                    //ensure more lines exist
                 if(fileScanner.hasNextLine())
                 {
                    line = fileScanner.nextLine();
                    trimmedLine = line.trim();
                 }
              }
                //append the ending line of the block comment, has '*/'
              ui.append(line, commentColor);
              ui.append(newline);
           }
           else if(trimmedLine.startsWith("//")) //start of single line comments
           {
              ui.append(line, commentColor);
              ui.append(newline);
           }//end if
        }//end if
     }//end while
            fileScanner.close();
  }//end readFileData()
  

Любая помощь была бы отличной.

Охотник

также опубликовано по адресу:http://www.coderanch.com/t/541081/java/java/Lines-lost-during-reading-file#2454886

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

1. Вы загрузили его в отладчик и выполнили пошаговую обработку? Как выглядит содержимое файла?

2. Содержимое файла является файлом Java, по какой-то причине эта ошибка возникает только в больших файлах. Я надеялся избежать пошагового просмотра этого огромного файла, но, возможно, придется.

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

Ответ №1:

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

     int example /* my example is 3 */ = 3;
    for (int i = 0; i < 3; i   ) { // process now.   ... 

    } // okay I'm done.
  

комментарии могут начинаться не с начала обрезанной строки.

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

1. вау, спасибо, я только что понял, что меня тестировали на .contains() вместо StartsWith()

Ответ №2:

Проблема возникает здесь:

 //ensure more lines exist
             if(fileScanner.hasNextLine())
             {
                line = fileScanner.nextLine();
                trimmedLine = line.trim();
             }
  

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

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

1. этот оператор if находится в цикле while, я добавляю строку, затем считываю новую строку из файла, затем тестирую строку. Я не понимаю, как это заменяет строку

Ответ №3:

вы могли бы попробовать

 String s;
if ((s = fileScanner.nextLine()) != null) {
    trimmedLine = s.trim();
    //do stuff
}
  

Ответ №4:

Вам следует попробовать запустить свой метод в потоке отправки событий Swing. Возможно, у вас возникли проблемы с потоками.

Если проблема в этом, то для повышения производительности вам следует прочитать файл в каком-нибудь потоке и отправить результат в графический интерфейс пользователя, как только у вас будет весь файл в виде строки.