我正在尝试读取此文件,然后将其放入List:
23333
Manuel Oliveira
19
222222
Mário Santos
18
使用扫描仪。 如果忽略19和222222之间的空行,我就是这样做的。
public List<Aluno> lerFicheiro ( String nomeF) throws FileNotFoundException{
List<Aluno> pauta = new LinkedList<Aluno>();
try{
Scanner s = new Scanner ( new File ( nomeF));
int cont = 0;
String numero = null;
String nome = null;;
String nota;
while ( s.hasNextLine())
{
if ( cont ==0)
{
numero = s.nextLine();
}
else
{
if ( cont == 1)
nome = s.nextLine();
else
{
if ( cont == 2)
{
nota = s.nextLine();
cont =-1;
pauta.add( new Aluno(Integer.valueOf(numero), nome, nota));
}
}
}
cont++;
}
s.close();
}
catch ( FileNotFoundException e)
{
System.out.println(e.getMessage());
}
return pauta;
}
但我不知道如何用空行读它。 谢谢。
答案 0 :(得分:1)
对于初学者来说,那里有一个基本状态机的良好开端。您可以通过两种方式考虑空行:
cont
。第一种方法的优点是,即使文件中有多个空行,或者名称后面有空行,也会被忽略。如果“nota”之后的其他空行有用,第二种方法会更好。
我认为阅读该行会更优雅,然后根据cont
决定如何处理它。所以对于第一种方法(忽略任何空行):
while ( s.hasNextLine()){
// First read
String theLine = s.nextLine();
// Ignore it if it's empty. That is, only do something if
// the line is not empty
if ( ! theLine.isEmpty() ) {
if ( cont == 0){
numero = theLine; // You use the line you have read
}else if ( cont == 1) {
nome = theLine;
}else {
nota = theLine;
cont =-1;
pauta.add( new Aluno(Integer.valueOf(numero), nome, nota));
}
cont++;
}
}
当您读取空行时,状态(cont
)不会更改。所以就好像这条线从未存在过一样。
请注意,使用常量而不仅仅是0
,1
,2
会更好,这样它们才有意义。
还要注意正确编写if...else if...else
的方法。你不需要一直把它们放在花括号中。
答案 1 :(得分:0)
您可以将分隔符设置为表示一个或多个行分隔符的正则表达式,例如(\r?\n)+
(或自Java 8 \R+
以来),只需使用next()
方法读取行。
顺便说一句:你不应该将close()
放在try
块内,而是放在finally
块中。或者更好地使用try-with-resources。
因此,如果您确定该文件将始终包含来自3行的令牌构建,那么您的方法可能看起来像(为了简单起见,我将返回类型更改为List<String>
,但您应该能够很容易地将其更改回来)
public static List<String> lerFicheiro(String nomeF)
throws FileNotFoundException {
List<String> pauta = new LinkedList<>();
try (Scanner s = new Scanner(new File(nomeF))){
s.useDelimiter("\\R+");
while (s.hasNext()) {
//since delimiter is line separator `next` will read lines
String numero = s.next();
String nome = s.next();
String nota = s.next();
pauta.add(numero + ":" + nome + ":" + nota);
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
}
return pauta;
}