从Java中的文本文件中读取long类型

时间:2012-03-10 15:52:33

标签: java long-integer stringtokenizer numberformatexception

我正在尝试使用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);

}

如果你能帮助我,我将非常感激,也谢谢你。

3 个答案:

答案 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
}

两个版本都正确解析了您的示例输入。

这是第三个fully working Java 6 Version