这是您的程序的一个新版本,它可能会完成您尝试做的事情。此版本使用正则表达式来匹配所需格式的条目,而无需限制查看的行以避免错误。
如果只需要解析文件有效条目的子集,则应根据实际字段值过滤它们,而不是根据行号。(此类应用程序所需的常用过滤类型是基于日期的。)
此外,我使用了一些仅在 Java 7 中可用的语言功能。如果您绝对必须使用 Java 6,将 try-with-resources 更改为在 Java 6 中可用的东西应该相对容易。
我使用的正则表达式和解析指令可能并不完全是您在这个应用程序中所需要的;如果是这样,请更改它们。它们基于您的条目格式类似于START 848297 "2013 January 9 12:46:04 AM"
或的假设END 848297
;如果日期是作为 Unix 时间戳给出的,你应该使用类似new Date(Integer.parseInt(match.group(3)))
的东西来构造日期对象;其他格式可能需要使用专门的DateFormat
实例来解析它们
File inputFile = new File("fooFile.txt");
HashMap<Integer, Date> dataStore = new HashMap<>();
//Date begin = new Date(), end = new Date(); //for date filtering, if needed
Pattern entry = Pattern.compile("(START)\\s*(\\d+)\\s*"(.*)"|(END)\\s*(\\d+)");
try(Scanner in = new Scanner(inputFile))){
//for buffering, use `new Scanner(new BufferedReader(new FileReader(inputFile)))`
while(in.hasNext(entry)){
MatchResult match = in.match();
switch(match.group(1)){
case "START":
int startID = Integer.parseInt(match.group(2));
Date dateTime = DateFormat.parseDate(match.group(3));
//if you need to filter by date, uncomment the if blocks
//if(dateTime.before(begin)) break; //don't process dates before begin
//if(dateTime.before(end)) break; //don't process dates after end
dataStore.put(startID, dateTime);
break;
case "END":
int endID = Integer.parseInt(match.group(2));
dataStore.remove(endID);
break;
default:
throw new InputMismatchException();
}
}
} catch (InputMismatchException | IOException ex){
throw ex; //please change if other behaviors are desired
}