扫描仪读取文件 - nextLine()

时间:2017-04-27 20:46:50

标签: java file

我的作业有问题。基本上方法printLinesWhichContain(String word)应该打印包含给定单词的行,这样可以正常工作,如果String为空(""),则打印文件中的所有行。最后一部分不起作用。有什么建议吗?

import java.io.File;
import java.util.Scanner;
public class Printer {
    private File lol;
    private Scanner reader;

    public Printer(String fileName)throws Exception{
        this.lol = new File(fileName);
        this.reader = new Scanner(lol);
    }

    public void printLinesWhichContain(String word) {
        if (word.isEmpty()) {
            while (this.reader.hasNextLine()) {
                String x = this.reader.nextLine();
                System.out.println(x);
            }

        } else {
            while (this.reader.hasNextLine()) {
                String x = this.reader.nextLine();
                if (x.contains(word)) {
                    System.out.println(x);
                }
            }
        }

    }
}

主要

public class Main {

    public static void main(String[] args) throws Exception {
       Printer printer = new Printer("src/textfile.txt");

    printer.printLinesWhichContain("Väinämöinen");
    System.out.println("-----");
    printer.printLinesWhichContain("Frank Zappa");
    System.out.println("-----");
    printer.printLinesWhichContain("");
    System.out.println("-----");
    }
}

档案文字

Siinä vanha Väinämöinen
katseleikse käänteleikse 
Niin tuli kevätkäkönen
näki koivun kasvavaksi 
Miksipä on tuo jätetty
koivahainen kaatamatta  
Sanoi vanha Väinämöinen 

输出

Siinä vanha Väinämöinen
Sanoi vanha Väinämöinen 
-----
-----
----- 

2 个答案:

答案 0 :(得分:0)

在您的应用程序中,您只创建了一个扫描程序,它只能遍历整个文件一次。如果您希望每次调用printLinesWhichContain方法时迭代整个文件,则需要重置扫描程序,最有可能是创建新扫描程序。

因此,其中一个选项是在

结束时重新初始化使用过的扫描程序
public void printLinesWhichContain(String word) {
    //...your original code

    this.reader = new Scanner(lol);
}

方法。但是如果你不在这种方法之外的其他地方使用扫描仪,那么可能值得将它变成局部变量而不是类字段。

public void printLinesWhichContain(String word) {
    Scanner reader = new Scanner(lol);

    //...your original code
}

其他选项可能是读取文件一次并使用

等代码存储其内容
List<String> allLines = Files.readAllLines(lol.toPath()); 

您可以遍历此列表而不是文件。

答案 1 :(得分:0)

如果您将main更改为:

public static void main(String[] args) throws Exception {
    Printer printer = new Printer("src/textfile.txt");

    printer.printLinesWhichContain("Väinämöinen");
    System.out.println("-----");
    printer.printLinesWhichContain("Frank Zappa");
    System.out.println("-----");
    printer = new Printer("src/textfile.txt");

    printer.printLinesWhichContain("");
    System.out.println("-----");
}

它会起作用。原因是,由于您编写代码的方式,printer需要重新初始化,以便它可以从头开始重读。