我一直在为大学活动编写这段代码:我需要从.txt文件中读取一些行,将它们存储在HashMap中,并根据文件中的内容打印一些结果。 这些行是一个姓名和一个数字,分别是该人的姓名和年龄。 例如:
标记23
约翰32岁
.txt文件包含一些人的名字,该程序运行良好,但有一个例外:列表的名字被读取,存储在HashMap中,但是每次我用map.get()
或map.containsKey()
它告诉我密钥不存在。
仅使用读取的名字会发生此问题。 在我给出的示例中,它会与 Mark 一起发生,但是如果我更改行的顺序,将 John 放在第一位,它将发生在他身上,而不是 >标记。
请记住,键是人的名字,值是我为该人创建的对象。
这是我的代码:
class Person {
private String name;
private int age;
//Getter
public int getAge() {
return this.age;
}
public String getName() {
return this.name;
}
//Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//toString
@Override
public String toString() {
return name + " " + age;
}
}
class OpenText {
public static void textReader(String directory) {
try {
BufferedReader file = new BufferedReader(new FileReader(directory));
String line;
String[] lineSplit;
while ((line = file.readLine()) != null) {
lineSplit = line.split(" ");
try {
int age = Integer.parseInt(lineSplit[1]);
Main.hMap.put(lineSplit[0], new Person(lineSplit[0], age));
} catch (NumberFormatException exc) {
System.out.println(exc);
}
}
file.close();
} catch (IOException exc) {
exc.printStackTrace();
}
}
}
public class Main {
public static Map<String, Person> hMap = new HashMap<>();
public static void main(String[] args) {
OpenText.textReader("DIRECTORY OF THE FILE");
System.out.println(hMap.keySet());
System.out.println(hMap.values());
System.out.println(hMap.get("John"));
}
// [John, Mark, Peter, Philip, Mary]
// [John 32, Mark 23, Peter 37, Philip 20, Mary 54]
// null
}
我想很明显,我只是Java的新手,但是任何见识都将不胜感激!
谢谢!
答案 0 :(得分:3)
某些文本编辑器会将不可打印的字符添加到文件的开头,以便当另一个文本编辑器读取文件时,它知道使用了什么字符结尾。例如https://en.wikipedia.org/wiki/Byte_order_mark
BufferedReader并没有对这些字符做任何特殊处理,而是将它们视为看不见的文本。
在您的情况下,这意味着第一个单词实际上实际上在开头都有一些不可打印的字符,这意味着它不完全匹配。
要处理任意BOM,您可以使用以下解决方案。
Byte order mark screws up file reading in Java
我只是确保您不首先添加这些内容。
一个更简单的解决方案是,如果适合您,则忽略这些字符。
line = line.replaceAll("[\0\uFFFD]", "");
btw
BufferedReader br = new BufferedReader(
new InputStreamReader(
new ByteArrayInputStream(
new byte[]{(byte) 0x0, (byte) 0x0, 'H', 'i', '\n'}
)));
String line = br.readLine();
System.out.println("line.length()=" + line.length());
System.out.println(line);
打印
line.length()=4
Hi
您需要检查String的实际长度是否符合您的预期。
答案 1 :(得分:1)
我不知道您在这里使用的Java版本。我尝试了一个小的改动您的代码,它工作正常。只需注意记录之间是否有任何新的空白行。 例如,您不应具有以下文件内容:
马克23
约翰32
如果它们之间没有空行,则正常。这是我用于主班的代码
public class Main {
public static Map<String, Person> hMap = new HashMap<String, Person>();
public static void main(String[] args) {
OpenText.textReader("C:\\Projects\\Trials\\directory\\src\\com\\hello\\nameList.txt");
System.out.println(hMap.keySet());
System.out.println(hMap.values());
System.out.println(hMap.get("John"));
}
}
我刚刚将HashMap的创建内容更新为new HashMap<String, Person>();