我有一个格式为:
的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());
}
答案 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());
}