Java: программа чтения файлов, разделитель строк по разделителям справка

#java #string #file #arraylist #preprocessor

#java #строка #файл #список массивов #препроцессор

Вопрос:

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

Вопрос: Как мне добавить строки в середине <<< >>> в какой-то собственный список массивов.

 public class processLines  {
public void pLine (String FileName)throws IOException{
    Scanner scanner = null;
    try{
        scanner = new Scanner(new BufferedReader(new FileReader(FileName)));
        while (scanner.hasNext()) {
            String Line = "";
            String LineB = "";
            String LineC = "";
            ArrayList<String> inside = new ArrayList<String>();
            Line = Line   scanner.next()  " ";
            System.out.println("outside token: "  Line);
            StringTokenizer token = new StringTokenizer(Line);
            while(token.hasMoreTokens()amp;amp; token.nextToken() != null){
                LineB = Line;
                if(LineB.contains("<<<")){
                    if(!LineB.contains(">>>") ){
                        LineC = LineC   scanner.next()  " "; 
                        inside.add(LineC);
                        System.out.println("LineC: "   LineC);
                        System.out.print(inside);
                    }
                        if(scanner.next(">>>") != null){
                            Line =  scanner.next();
                            System.out.println("Line INside:"   Line);
                        }
                }
            }
        }
    }
    finally {
        if (scanner != null) {
            scanner.close();
        }
    }
}
  

}

Исходный код текстового файла содержит «Mo <<< Mo Ларри Керли >>> Ларри», все в одной строке. этот код работает, если в середине <<< >>> есть только одно имя, но когда я добавляю больше, я получаю сообщение об ошибке.

Возникающее сообщение об ошибке: внешний токен: Mo

внешний токен: <<< LineC: Исключение Mo [Mo ] в потоке «main» java.util.Исключение InputMismatchException в java.util.Scanner.throwFor(неизвестный источник) в java.util.Scanner.next(неизвестный источник) в java.util.Сканер.следующий (неизвестный источник) в processLines.pLine(processLines.java:26) в proProcess.main(proProcess.java:14)

Ответ №1:

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

 public static void pLine (String FileName)throws IOException{
Scanner scanner = null;
try{
    scanner = new Scanner(new BufferedReader(new FileReader(FileName)));
    String line;
    ArrayList<String> inside;
    Scanner inner;
    int start;
    int end = 0;
    while (scanner.hasNextLine()) {
           line = scanner.nextLine();
           inside = new ArrayList<String>();
           start = line.indexOf("<<<", end);       
           end = line.indexOf(">>>", start 1);
           if (end > start) {
                inner = new Scanner(line.substring(start  3, end ));
                while (inner.hasNext()) {
                    inside.add(inner.next());
                }
            }
            System.out.println("inside : "   inside);
        }
    }
    catch (Throwable t) {
        t.printStackTrace();
    }
    finally {
        scanner.close();
    }
}