我正在尝试使用readLine()
类BufferedReader
方法从文本文件中读取长类型,然后使用{{1}解析第一个标记(长类型号)但我面临一个异常错误,即StringTokenizer
这是我的文本文件的一个示例;
java.lang.NumberFormatException
这是我从文本文件中读取的代码,并将long值赋给我的长变量
2764841629 Quaroten Ilen
1398844030 Orden Nenama
1185252727 Inja Nenaptin
2370429126 Quaren Inaja
1502141743 Otin Una
1993687334 Quarwennaja Nenoten
1015934104 Polen Meritna
2363674760 Otja Ie
1904629749 Neninin Ordja
3047965620 Algnaja Nenja
最后这是我面临的错误;
private void registerData() throws FileNotFoundException{
try {
String regPatName;
String regPatSurname;
long regPatID;
FileInputStream fis = new FileInputStream("src\\assignment_3\\injuredPersonList.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
String line;
while( ( line = reader.readLine() ) != null) {
StringTokenizer st = new StringTokenizer(line, " ");
while(st.hasMoreTokens()){
regPatID = Long.parseLong(st.nextToken());
regPatName = st.nextToken();
regPatSurname = st.nextToken();
Patient regPatient = new Patient(regPatName, regPatSurname, regPatID);
hashMethod(regPatient);
}
}
} catch (IOException ex) {
Logger.getLogger(personTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void hashMethod(Patient regPatient){
Long idPat = new Long(regPatient.getPatientID());
int keyID;
keyID = (int) Math.sqrt(Integer.parseInt(idPat.toString().substring(0, 5) + idPat.toString().substring(5, 10))) % (50000);
System.out.println(keyID);
}
如果你能帮助我,我将非常感激,也谢谢你。
答案 0 :(得分:4)
显然,您正在尝试解析非数字字符串,堆栈跟踪会显示它:2481765933 Otna
。您应该拆分输入并解析数字部分,如下所示:
String[] data = line.split("\\s+");
regPatID = Long.parseLong(data[0]);
regPatName = data[1];
regPatSurname = data.length == 3 ? data[2] : "";
上述内容比使用StringTokenizer
简单得多。事实上,StringTokenizer
的使用是discouraged,实际上已弃用 - 现在,解析字符串的首选方法是使用split()
方法处理简单案例或Scanner
复杂案件的课程。
答案 1 :(得分:4)
您可能有一个制表符而不是空格来分隔字段。将标签添加到您的分隔符集" \t"
)。
此外,始终在finally块中关闭您的流和读取器(只有最外层的一个必须关闭:关闭BufferedReader将关闭InputStreamReader,它将关闭FileInputStream)。
答案 2 :(得分:3)
您使用了错误的分隔符(" "
),因为您的文本文件可能在令牌之间包含多个空格字符。 StringTokenizer
是一个遗留类,除非你有充分的理由,否则不要使用它。 String.split()应该足够了:
String[] result = line.split("\\s+");
regPatID = Long.parseLong(result[0]);
regPatName = result[1];
regPatSurname = result[2];
但我认为Scanner最适合您的问题:
// Java 7 try-with-resources synthax.
// If you are using Java <=6, declare a finally block after the catch
// to close resources.
try (InputStream myFile = ClassLoader.getSystemResourceAsStream("MyTextFile.txt");
Scanner sc = new Scanner(myFile)) {
while (sc.hasNext()) {
regPatID = sc.nextLong();
regPatName = sc.next();
regPatSurname = sc.next();
System.out.printf("%d - %s %s\n", regPatID, regPatName, regPatSurname);
}
} catch (Exception e) {
// Do something about exceptions
}
两个版本都正确解析了您的示例输入。