#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();
}
}