Java Scanner 类读取字符串
我创建了一个扫描器类来读取文本文件并获取我想要的值。假设我有一个文本文件包含。
人员列表:长度3
1:Fnjiei:ID 7868860:年龄 18
2:Oipuiieerb:ID 334134:年龄 39
3:Enekaree:ID 6106274:年龄 31
我试图获取姓名、身份证号码和年龄,但每次我尝试运行我的代码,它给了我一个例外。这是我的代码。 java 专家有什么建议吗?:) 它能够读取一行......但最多只能读取一行文本。
public void readFile(String fileName)throws IOException{
Scanner input = null;
input = new Scanner(new BufferedReader(new FileReader(fileName)));
try {
while (input.hasNextLine()){
int howMany = 3;
System.out.println(howMany);
String userInput = input.nextLine();
String name = "";
String idS = "";
String ageS = "";
int id;
int age;
int count=0;
for (int j = 0; j <= howMany; j++){
for (int i=0; i < userInput.length(); i++){
if(count < 2){ // for name
if(Character.isLetter(userInput.charAt(i))){
name+=userInput.charAt(i); // store the name
}else if(userInput.charAt(i)==':'){
count++;
i++;
}
}else if(count == 2){ // for id
if(Character.isDigit(userInput.charAt(i))){
idS+=userInput.charAt(i); // store the id
}
else if(userInput.charAt(i)==':'){
count++;
i++;
}
}else if(count == 3){ // for age
if(Character.isDigit(userInput.charAt(i))){
ageS+=userInput.charAt(i); // store the age
}
}
id = Integer.parseInt(idS); // convert id to integer
age = Integer.parseInt(ageS); // convert age to integer
Fighters newFighters = new Fighters(id, name, age);
fighterList.add(newFighters);
}
userInput = input.nextLine();
}
}
}finally{
if (input != null){
input.close();
}
}
}
如果我的代码需要更改,我深表歉意。
已编辑它给了我一个数字格式异常! 我不知道这些值之间会有多少空白。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
上面的代码片段显示了基本思想。另请记住,这可能不是最佳解决方案。
Above snippet shows the basic idea.Also please keep in mind that this might not be the optimal solution.
这是一种仅使用
Scanner
API 的解决方案,其中重要的一个是findInLine
。它可以处理输入格式中的细微语法变化,但它的可读性非常好,不需要花哨的正则表达式或魔术数组索引。这将打印:
API 链接
Scanner.findInLine(模式模式)
Pattern.compile
如果性能存在问题,则重载Here's a solution that uses only
Scanner
API, the important one beingfindInLine
. It can handle minor syntactic variations in the input format, and yet it's very readable, requiring no need for fancy regex or magic array indices.This prints:
API links
Scanner.findInLine(Pattern pattern)
Pattern.compile
overload if performance is an issue这似乎更短:
对于您向我们提供的输入,它会打印以下内容:
有关 split 方法的更多信息,请参阅 此处。我基本上首先使用
:
作为分隔符来分割该行,然后,我使用\\s+
再次分割该行,它基本上分割一个字符串并返回一个包含单词的数组由空格分隔。This seems to be shorter:
For the input you have us, it prints this:
More information about the split method can be found here. I basically first split the line by using the
:
as delimiter, then, I split again using the\\s+
, which basically splits a string and return an array containing the words that were separated by white spaces.