Java读取格式化文本文件并将其分割
我试图理解类的文件I/O,我理解基础知识,但在理解如何管理输入文件中的内容时遇到困难,输入文件的格式如下: 业务联系人:firstName=Nikolaos;lastName=Tsantalis SocialNetworkAccount:socialNetworkType=SKYPE;accountID=tsantalis 基本上,我的联系人(BusinessContact的扩展)对象具有firstName、lastName和middleName属性, 它还具有对象属性,如SocialNetworkAccount等 我不需要解释我的对象是如何格式化的,我只想了解我的file.txt如何输入到我的程序中,将我的联系人设置为BusinessContact,并相应地设置名字和姓氏 谢谢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
编辑:我被特别告知要使用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