为什么一个println语句会更改我的代码的整个输出?

时间:2019-04-01 17:21:58

标签: java file file-io java.util.scanner

问题

我当前正在创建一个程序来读取文件并找到几个变量。我遇到了一个问题,即更改一个println会更改我的代码的整个输出。我以前从未遇到过这个问题,也不确定这是月食错误还是我的错误?

我的代码

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class FileAnalyzer {
    public static void main(String args[]) throws IOException {
        Scanner input = new Scanner(System.in);
        String fileName;
        int words = 0, letters = 0, blanks = 0, digits = 0, miscChars = 0, lines = 0;

        System.out.print("Please enter the file path of a .txt file: ");
        fileName = input.nextLine();

        File text = new File(fileName);
        //System.out.println(text.exists());

        Scanner word = new Scanner(text);
        while(word.hasNext()) {
            //System.out.println(word.next());
            words++;
        }
        word.close();

        Scanner letter = new Scanner(text);
        while(letter.hasNext()) {
            String currentWord = letter.next().toLowerCase();
            for(int i = 0; i < currentWord.length(); i++) {
                if(Character.isLetter(currentWord.charAt(i))) {
                    letters++;
                }
            }
        }
        letter.close();

        Scanner blank = new Scanner(text);
        while(blank.hasNextLine()) {
            String currentWord = blank.nextLine();
            for(int j = 0; j < currentWord.length(); j++) {
                if (currentWord.charAt(j) == ' ') {
                    blanks++;
                }
            }
        }
        blank.close();

        System.out.println("Words: " + words);
        System.out.println("Letters: " + letters);
        System.out.println("Blanks: " + blanks);


    }
}

但是

在第一个Scanner实例中只需更改System.out.println(word.next())即可更改整个输出。如果我将其留在底部,则会在底部找到三个打印语句,并查找所需的内容。如果我删除它是因为我不想在文件中打印每个单词,那么它将在控制台中显示为空。不确定为什么while语句中的一个print语句会更改整个输出。首先出现在其中的唯一原因是确保扫描仪以我想要的方式获取输入。

3 个答案:

答案 0 :(得分:1)

  

不确定为什么while语句中的一个print语句会更改整个输出

由于存在该语句,因此您正在使用扫描程序中的令牌。当它被注释掉时,您不是。消耗令牌的不是打印,而是对next()的调用。

注释掉后,您的循环为:

while (word.hasNext()) {
    words++;
}

hasNext()不会修改扫描器的状态,因此 只要进入循环主体就永远循环。

如果您想要一行,可以注释掉或不注释掉,将代码更改为:

while (word.hasNext()) {
    String next = word.next(); // Consume the word
    System.out.println(next); // Comment this out if you want to
    words++;
}

答案 1 :(得分:1)

由于使用export default function (sequelize, DataTypes) { const Order = sequelize.define('Order', { // your fields default_address: { type: DataTypes.ENUM(), values: ['address', 'address2'], allowNull: false, // defaultValue: 'address', }, { hooks: { beforeValidate: function(instance) { switch (instance.default_address) { case 'address': case 'address2': { // check to see if address_id or address2_id is set, as needed if (!instance[instance.default_address + '_id') { // or + 'Id' if you use camel case return Sequelize.Promise.reject( new Error(`Default "${instance.default_address}" not set`) ); } } default: { return Sequelize.Promise.reject( new Error('You must set a default address') ); } } }, } } }); 方法,因此使用Simple example using 'Users': public class HomeController : Controller { [Authorize(Users ="user")] public string Index() { return "This is the Index action on the Home controller" + System.Security.Principal.WindowsIdentity.GetCurrent().Name; } } Note: Printing 'Name' shows my user name. However, in the 401 error message, I see this: Logon Method Anonymous Logon User Anonymous When I check the xml log file, it shows : remoteUserName="" userName="" tokenUserName="<my user name>" 循环浏览集合中的元素。因此,直接调用System.out.println(word.next());可以使您逐步进行迭代。

注释掉next()时,next()将使您永远循环(假设有一个单词),因为您将无法移至下一个标记。

下面的代码段将帮助您获得所需的结果

//System.out.println(word.next());

答案 2 :(得分:-1)

不确定您为什么要遍历三次文本。但是,如果确实需要,我会在打开下一个扫描仪之前先关闭它。