Java将txt文件读取到hashmap,由"分开:"

时间:2015-03-15 14:32:02

标签: java file text java.util.scanner

我有一个格式为:

的txt文件
Key:value
Key:value
Key:value
...

我想将所有键及其值放在我创建的hashMap中。如何让FileReader(file)Scanner(file)知道何时在冒号(:)分割键和值? : - )

我试过了:

Scanner scanner = new scanner(file).useDelimiter(":");
HashMap<String, String> map = new Hashmap<>();

while(scanner.hasNext()){
    map.put(scanner.next(), scanner.next());
}

4 个答案:

答案 0 :(得分:7)

使用BufferedReader逐行阅读您的文件,并且对于每一行,在该行中第一次出现split时执行:(如果没有{ {1}}然后我们忽略该行。)

这是一些示例代码 - 它避免使用Scanner(它有一些微妙的行为,imho实际上比它的价值更麻烦)。

:

答案 1 :(得分:6)

以下内容适用于java 8。

.filter(s -> s.matches("^\\w+:\\w+$"))意味着它只会尝试在文件中排队,这两个字符串由:分隔,显然对这个正则表达式的修改会改变它允许的内容。

.collect(Collectors.toMap(k -> k.split(":")[0], v -> v.split(":")[1]))将适用于与前一个过滤器匹配的任何行,在:上拆分它们然后使用该拆分的第一部分作为映射条目中的键,然后是第二部分拆分为地图条目中的值。

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.stream.Collectors;

public class Foo {

    public static void main(String[] args) throws IOException {
        String filePath = "src/main/resources/somefile.txt";

        Path path = FileSystems.getDefault().getPath(filePath);
        Map<String, String> mapFromFile = Files.lines(path)
            .filter(s -> s.matches("^\\w+:\\w+"))
            .collect(Collectors.toMap(k -> k.split(":")[0], v -> v.split(":")[1]));
    }
}

答案 2 :(得分:2)

另一个JDK 1.8实现。

我建议使用try-with-resources和forEach迭代器和putIfAbsent()方法来避免 java.lang.IllegalStateException:重复键值如果有一些重复值文件。

<强> FileToHashMap.java

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
import java.util.HashMap;
import java.util.stream.Stream;

public class FileToHashMap {
    public static void main(String[] args) throws IOException {
        String delimiter = ":";
        Map<String, String> map = new HashMap<>();

        try(Stream<String> lines = Files.lines(Paths.get("in.txt"))){
            lines.filter(line -> line.contains(delimiter)).forEach(
                line -> map.putIfAbsent(line.split(delimiter)[0], line.split(delimiter)[1])
            );
        }

        System.out.println(map);    
    }
}

<强> in.txt

Key1:value 1
Key1:duplicate key
Key2:value 2
Key3:value 3

输出结果为:

{Key1=value 1, Key2=value 2, Key3=value 3}

答案 3 :(得分:0)

我会这样做

Properties properties = new Properties();
properties.load(new FileInputStream(Path of the File));
for (Map.Entry<Object, Object> entry : properties.entrySet()) {
    myMap.put((String) entry.getKey(), (String) entry.getValue());
}