Java读取格式化文本文件并将其分割

Java读取格式化文本文件并将其分割,java,file-io,text-files,fileinputstream,Java,File Io,Text Files,Fileinputstream,我试图理解类的文件I/O,我理解基础知识,但在理解如何管理输入文件中的内容时遇到困难,输入文件的格式如下: 业务联系人:firstName=Nikolaos;lastName=Tsantalis SocialNetworkAccount:socialNetworkType=SKYPE;accountID=tsantalis 基本上,我的联系人(BusinessContact的扩展)对象具有firstName、lastName和middleName属性, 它还具有对象属性,如SocialNetwo

我试图理解类的文件I/O,我理解基础知识,但在理解如何管理输入文件中的内容时遇到困难,输入文件的格式如下:

业务联系人:firstName=Nikolaos;lastName=Tsantalis SocialNetworkAccount:socialNetworkType=SKYPE;accountID=tsantalis

基本上,我的联系人(BusinessContact的扩展)对象具有firstName、lastName和middleName属性, 它还具有对象属性,如SocialNetworkAccount等

我不需要解释我的对象是如何格式化的,我只想了解我的file.txt如何输入到我的程序中,将我的联系人设置为BusinessContact,并相应地设置名字和姓氏

谢谢


编辑:我被特别告知要使用split方法,这很有意义,但我也被告知(1)创建一个用于解析属性的通用方法,该方法返回一个映射,其中键对应于attributeName,值对应于attributeValue(通过这种方式,您可以重用相同的代码)

您可以使用正则表达式,但是使用String.split:split on更合适:“并获取标签,在”;“上拆分第二部分”以获取属性,然后在“=”上拆分每个属性以获取键和值。

您可以使用带有不同分隔符的
Scanner
类,如下所示:

Scanner in = new Scanner(/**source*/);

in.useDelimiter(":");

String firstName, lastName;

String firstWord = in.next();

Scanner nameScanner = new Scanner(in.nextLine());

nameScanner.useDelimiter(";");

firstName = getName(new Scanner(nameScanner.next()));

lastName = getName(new Scanner(nameScanner.next()));


private String getName(Scanner nameScanner){
    nameScanner.useDelimiter("=");

    String nameTitle = nameScanner.next();

    return nameScanner.next();
}
通过这种方式,您可以按如下部分阅读文本:

BusinessContact
firstName=Nikolaos;lastName=Tsantalis

firstName=Nikolaos
lastName=Tsantalis

firstName
=
Nikolaos
lastName
=
Tsantalis

我希望这是有道理的

注意:此代码仅读取第一行。如果你想读第二本,我想修改它并不难。如果你想要第二行,或者如果你有任何问题,让我知道,我会更新答案

编辑:我刚刚注意到每一行的格式都是相同的,因此基本上每一行都可以使用相同的代码。可能在一个循环中,例如:

Scanner input = new Scanner(/**source*/);

while(input.hasNextLine()){
    Scanner in = new Scanner(input.nextLine());
    ...
    ....
    //The above code
}
String.split()方法:

Scanner in = new Scanner(System.in);

String[] first = in.nextLine().split(":");
String[] second = first[1].split(";");
String[] thirdA = second[0].split("=");
String[] thirdB = second[1].split("=");

for(int i = 0; i < thirdA.length; i++){
    System.out.println(thirdA[i]);
    System.out.println(thirdB[i]);
}

希望这能有所帮助。

我想您必须解析文件,提取所需的内容,从字符串实例化类,并填写字段。听起来不太舒服。每一行的格式都像
[label]:([key]=[value])(;[key]:[value])…
是有道理的,但必须有一个原因,那就是文本文件明确地写着“firstName=Nikolaos”,因为在我有一个名为firstName的字符串类型的属性,而这一行以某种方式设置了它。。。这太令人困惑了:/是的,有人特别告诉我要使用split方法,但我也被告知如下:(1)创建一个解析属性的通用方法,返回一个映射,其中键对应于attributeName,值对应于attributeValue(这样你可以重用相同的代码)。这是你的作业,而不是我的。这是一个相当简单的练习。这是有意义的,但是我必须使用Split方法而不是useDelimiter,并且我被指示创建一个解析属性的通用方法,该方法返回一个映射,其中键对应于AttributeName,值对应于AttributeValue(通过这种方式,您可以重用相同的代码)嗯,无论是使用
Scanner
还是
String.split()。1) 逐行阅读2)在
处拆分:
3)在
处拆分4)在
=
处拆分。用一两个方法将其打包,相应地存储值并返回它们。请注意,当您使用
String.split()
时,会返回一个
数组
,因此当您要进一步拆分时,必须访问所需的索引。好的,我理解,这是有道理的,但进一步说,我注意到我有一行middleName属性>BusinessContact:firstName=Marios;中间名=E。;lastName=Fokaefs我如何对此破例并使前面的中间名为空?您可以添加一些逻辑,用
检查有多少项作为分隔符。或者,如果使用的是
String.split()
计算数组中的元素数。如果
2
将中间名变量设置为
null
firstName
lastName
Nikolaos
Tsantalis