0

我想将条目插入到HashMap我通过使用BufferedReader.

BufferedReader reader = new BufferedReader(new FileReader(filepath));
String line = currentLine(filepath, pos1);
String endLine = currentLine(filepath, pos2);
while ((line = reader.readLine()) != endLine;){
    if (line.contains("START")){                    
        // [... parsing line ...]
        dataStore.put(startId, dateTime);
    } else {
        // [... parsing line ...]
        dataStore.remove(endId);                                
    }
}

但是当我检查dataStore(a HashMap) 它是空的。

4

2 回答 2

0

我建议您使用更简洁的方式从文本文件中读取行。

BufferedReader reader = new BufferedReader(new FileReader(filepath));
String line = null;
int lineNo = 0;     

while ((line = reader.readLine()) != null){
    lineNo++; 

    if (lineNo < starLine) continue;
    if (lineNo > endLine) break;

    if (line.contains("START")){                    
        // [... parsing line ...]
        dataStore.put(startId, dateTime);
    } else {
        // [... parsing line ...]
        dataStore.remove(endId);
    }
}

这应该可以完美地找到一个现有的文本文件,其中包含您期望的数据(我们不知道从哪里来startId)。 endIddateTime

于 2013-10-09T22:59:31.910 回答
0

这是您的程序的一个新版本,它可能会完成您尝试做的事情。此版本使用正则表达式来匹配所需格式的条目,而无需限制查看的行以避免错误。

如果只需要解析文件有效条目的子集,则应根据实际字段值过滤它们,而不是根据行号。(此类应用程序所需的常用过滤类型是基于日期的。)

此外,我使用了一些仅在 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
}
于 2013-10-10T14:59:09.280 回答