从java中的文件逐行读取

时间:2013-10-10 11:26:05

标签: java

我在java中遇到了BufferedReader的问题。我从大文件中逐行读取,解析行并插入到HashMap中,但结果只有几行在HashMap中

Map< Integer, String> data = new HashMap<>(1000000);
    int completedTestsCount = 0;
    BufferedReader reader = new BufferedReader(new FileReader("file.txt"), 120000);
    String line = null;
    while ((line = reader.readLine()) != null) {
        if (line.contains("START executing FOR"))
        {                   
            String tempId = line.substring(42, line.length() - 38);
            int startId = Integer.parseInt(tempId);
            String dateTime = line.substring(6, 14);
            data.put(startId, dateTime);                
        }

这是我要解析的文件行的示例“INFO 00:00:09 - 在9月23日星期一00:00:09 GMT + 00:00开始执行FOR test3625”,所以键是测试ID

3 个答案:

答案 0 :(得分:3)

HashMap将数据保存为,其中key是唯一的,因此在您的情况下,

String tempId = line.substring(42, line.length() - 38);

是关键,当你从文件中读取它时,这可能不是唯一的。这是问题所在,你必须确保密钥是唯一的。

答案 1 :(得分:0)

最可能的解释是文件中的许多行具有相同的startId。每次put具有相同密钥的键/值对时,您实际上替换该键的上一个映射条目。 (A Map将一个键映射到一个值......)

这可能是因为id 真的相同,或者可能是你从每行中提取id的方式不正确;例如如果实际的id并不总是从字符42开始。

根据我的统计,您的示例行中的字符42是2中的3625 ...这似乎不正确!

答案 2 :(得分:0)

要使用HashMaps,您需要所有stardId值都是唯一的。

在这种情况下,您应该使用列表而不是地图。

定义自定义KeyValuePair类并在列表中添加对象。

class KeyValuePair{
    int startId;
    String dateTime; 
}

List<KeyValuePair> data = new ArrayList<>();


String tempId = line.substring(42, line.length() - 38);
int startId = Integer.parseInt(tempId);
String dateTime = line.substring(6, 14);
data.add(new KeyValuePair(startId, dateTime))