静态方法之间的Java扫描仪指针问题

时间:2019-02-15 23:18:09

标签: java java.util.scanner

我的扫描仪对象有问题。看来,如果我将扫描仪传递给静态方法,则扫描仪将无法读取在main函数中提供的文件。当我将文件对象传递到扫描仪,然后将扫描仪传递到“添加”功能时,它不会将文件内容输出到控制台。但是,如果我注释掉“添加”功能的扫描仪部分,则扫描仪将正常读取。这使我相信扫描仪能够看到文件,但无法读取文件。我的问题是这次如何在Add函数中第二次从文件读取?

public static void main(String[] args) throws IOException
{
    File file = new File("vinceandphil.txt");

    if (file.createNewFile())
    {
        System.out.println("New file was created");
    }
    else {
        System.out.println("File already exists");
    }
    Scanner sc = new Scanner(file);

    FileWriter writer = new FileWriter(file);
    writer.write("Test data\n");
    Add(file, writer, sc);
    writer.close();

    while (sc.hasNextLine())
    {
        System.out.println(sc.nextLine());
    }

    sc.close();

}

public static void Add(File f, FileWriter w, Scanner scanner) throws IOException
{

    if (f.exists())
    {
        w.write("Got em coach\n");
        w.write("We need more info\n");
        w.write("Come again\n");
    }

    while (scanner.hasNextLine())
    {
        System.out.println(scanner.nextLine());
    }

}

1 个答案:

答案 0 :(得分:2)

您不能那样做。通过nextLine()读取一行后,该行将被“扔掉”,并且指针将指向下一行。

要从文件开头重新开始,必须实例化另一个Scanner

final Scanner yourNewScanner = new Scanner(file);

如果您想在文件中四处移动,请查看RandomAccessFile


您要指出的是Scanner没有打印出任何内容。
那是因为您在要求Scanner读取之前尚未关闭文件流。

if (f.exists())
{
    w.write("Got em coach\n");
    w.write("We need more info\n");
    w.write("Come again\n");

    // Adding this call flushes and closes the data stream.
    w.close();
}