繁体   English   中英

Java输入/输出和Scanner对象

[英]Java input/output and Scanner object

下面是我班上的两个函数,我想首先从文本文件中读取行数,然后将内容存储在数组中。 我遇到的问题是,如果我不注释掉int aNumber = numOfObjects(newInput); 数组不会被存储和打印,就好像numOfObjects函数到达了文本文件的末尾一样,我无法再访问它。 如果我将其注释掉,它会很好地工作。 我尝试添加第二个Scanner对象,但没有帮助。 我该怎么做才能使其正常工作?

public void correctListItems(FileInputStream inputFile,FileOutputStream outputFile){

        newInput = new Scanner(inputFile);
        forCapturing = new Scanner(inputFile);


        int aNumber = numOfObjects(newInput); 
        System.out.println(aNumber); 
        for(int i=0; forCapturing.hasNextLine(); i++){ 

            publicationArray[i] = new Publication();
            publicationArray[i].publication_code = forCapturing.nextLong();
            publicationArray[i].publication_name = forCapturing.next();
            publicationArray[i].publication_year = forCapturing.nextInt();
            publicationArray[i].publication_authorname = forCapturing.next();
            publicationArray[i].publication_cost = forCapturing.nextDouble();
            publicationArray[i].publication_nbpages = forCapturing.nextInt();
            System.out.println(publicationArray[i]);
            System.out.println("-----------------------------------\n");

        }
    }

private int numOfObjects(Scanner aScanner){ 
        int count = 0;
        while (aScanner.hasNextLine()){
            count++;
            aScanner.nextLine(); //if this isn't included you'll experience an infinite loop
        }
        System.out.println(count);
        return count;
    }
    } 

看来扫描器类在内部使用迭代器。 这意味着它需要在某些时候关闭,我在您的代码中找不到。 因此,我将(1)在返​​回之前在numOfObects函数中添加以下行:“ aScanner.close()”。
(2)可以肯定的是,在调用函数之后,我将创建第二个Scanner实例。 希望它能工作。

干杯!

除非您调用nextLine,否则扫描器不会移动到下一行。 因此循环是无限的,因为您始终处在第一行。 但是,为什么您需要提前知道对象的数量? 为什么不简单地使用列表而不是publicationArray?

好吧,我不确定,但是我可以肯定的是,一旦Scanner读取了字节,FileInputStream对象就会出现,扫描器将具有一个令牌来指示已经读取了特定的行。

您如何将代码更改为:

public void correctListItems(FileInputStream inputFile,FileOutputStream outputFile){

        forCapturing = new Scanner(inputFile);

        for(int i=0; forCapturing.hasNextLine(); i++){ 

            publicationArray[i] = new Publication();
            publicationArray[i].publication_code = forCapturing.nextLong();
            publicationArray[i].publication_name = forCapturing.next();
            publicationArray[i].publication_year = forCapturing.nextInt();
            publicationArray[i].publication_authorname = forCapturing.next();
            publicationArray[i].publication_cost = forCapturing.nextDouble();
            publicationArray[i].publication_nbpages = forCapturing.nextInt();
            System.out.println(publicationArray[i]);
            System.out.println("-----------------------------------\n");

        }
        System.out.println("Number of lines: "+ i);
    }

至少使用此方法,您不必对同一组数据运行2个循环。 更好的性能,并在一轮循环中完成您需要做的事情

您可以根据需要执行此操作。 即通过读取文件两次。 首先计数,然后捕获。

只需在您的行之后添加以下行int aNumber = numOfObjects(newInput); correctListItems函数中。

public void correctListItems(FileInputStream inputFile,FileOutputStream outputFile){

    newInput = new Scanner(inputFile);


    int aNumber = numOfObjects(newInput); 
    newInput.close();
    inputFile.close();
    inputFile = new FileInputStream(
            new File(
                    "inputfile.txt"));
    System.out.println(aNumber); 
    forCapturing = new Scanner(inputFile);
    for(int i=0; forCapturing.hasNextLine(); i++){ 
    ....
    ....

因此,基本上关闭扫描仪以及文件很重要。 然后再次创建fileinputreader流将把文件指针重置为文件的开头。 您可能已经知道,如果输入文件不是来自项目文件夹,则必须提供完整路径。

作为一个好的过程,完成操作后最好同时关闭扫描器对象和文件对象,然后重新初始化对象以再次开始处理它们。 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM