我一直在为大学活动编写这段代码:我需要从.txt文件中读取一些行,将它们存储在HashMap中,并根据文件中的内容打印一些结果。这些行是名称和数字,即该人的姓名和年龄。例如:
马克23
约翰逊32
.txt文件包含一些人名,程序运行良好,但有一个例外:列表的第一个名称被读取,存储在HashMap中,但每次我用map.get()
或map.containsKey()
达到它时,它告诉我键不能不存在。
只有读取的名字才会出现此问题。在我给出的例子中,它会发生在马克身上,但如果我改变线条的顺序,把约翰放在第一位,就会发生在他身上,而不是马克。
请记住,密钥是人的名称,值是我为该人创建的对象。
这是我的代码:
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的新手,但任何见解都会非常感激!
提前致谢!
一些文本编辑器会将不可打印的字符添加到文件的开头,以便在被另一个文本编辑器读取时,它知道使用了什么字符结尾。例如https://en.wikipedia.org/wiki/Byte_order_mark
BufferedReader不会对这些字符做任何特殊处理,而是将它们视为您看不到的文本。
在你的情况下,它意味着任何单词首先实际上在开始时有一些不可打印的字符,这意味着它不是完全匹配。
要处理任意BOM,您可以使用以下解决方案。
Byte order mark screws up file reading in Java
我只是确保你不是首先添加这些。
一个更简单的解决方案是忽略这些字符,如果它适合你。
line = line.replaceAll("[\0\uFFFD]", "");
顺便说一句
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
您需要检查字符串的实际长度是否符合预期。
我不知道你在这里使用什么版本的Java。我用一个小的chnage尝试你的代码,它工作正常。只需注意记录之间的任何新空白行。例如,你不应该有像这样的文件内容:
马克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>();