Java 在文件中拆分信息并读取它们

Java 在文件中拆分信息并读取它们,java,file,parsing,constructor,Java,File,Parsing,Constructor,我有一个文本文件: Jim Webb 27 Axelrod Street Hillary Sanders 92 California Street Bernie Trudeau 46 Pot Street Barack Bush 883 White Ave Mary Warren 736 Something Rd Donald Crump 65 Debate Street 我需要解析一个人、名字、姓氏和地址(个人姓氏后面的信息) 这是我的尝试: public Parse() {

我有一个文本文件:

Jim Webb 27 Axelrod Street
Hillary Sanders 92 California Street
Bernie Trudeau 46 Pot Street
Barack Bush 883 White Ave
Mary Warren 736 Something Rd
Donald Crump 65 Debate Street
我需要解析一个人、名字、姓氏和地址(个人姓氏后面的信息)

这是我的尝试:

public Parse() {
        parseFiles();
    }

    void parseFiles() {
        try {
            File file = new File("school.txt");
            Scanner sc = new Scanner(file);

            while (sc.hasNextLine()) {
                String s = sc.nextLine();
                String[] splited = s.split("\\s+");
                for (int i = 0; i < splited.length; i++) {
                    System.out.println(splited[i]);
                }
            }

        } catch (FileNotFoundException e) {
            System.out.println("File not found\n");
        }

    }

}
如果每次我都想初始化一个学生(在每一行读取之后),但是通过我的实现,我只能对名字和姓氏进行初始化,那么我如何单独解析整个地址呢?然后能够调用学生构造函数

您可以使用
.next()
获取名字和姓氏,然后使用
.nextLine()
获取行的其余部分,如下所示:

public Student(String name, String lastName, String address) {
this.name = name
//etc... 
}
String firstName = sc.next();
String lastName = sc.next();
String address = sc.nextLine();

假设文件结构永远不会改变,地址将始终位于最后两个位置。在
for
中添加
if
子句:

for (int i = 0; i < splited.length; i++) {
    if(i >= (splited.length - 2)) {
        System.out.println(splited[i] + " " + splited[i + 1]);
        break;
    } else
        System.out.println(splited[i]);
}

你为什么不逐行阅读并分成数组呢。然后把第三个元素后面的所有元素都作为地址?我不知道如何实现。嗯,这当然有效,但是在某个点上,我似乎得到了一个NosTouchElementException。嗯,没关系,我通过将while循环从hasNextLine更改为hasNextLine来修复它。我感谢您的努力,但是我想尽量简化我的代码。Jano的解决方案做到了这一点,不过对你来说是+1。是的,他的答案更好(而且更“生产友好”),不过还是谢谢你!
for (int i = 0; i < (splited.length - 2); i++) {
    System.out.println(splited[i]);
}
System.out.println(splited[splited.length - 2] + " " + splited[splited.length - 1]);