什么时候应该关闭扫描仪?

Posted

技术标签:

【中文标题】什么时候应该关闭扫描仪?【英文标题】:When should you close a scanner? 【发布时间】:2017-12-28 05:38:50 【问题描述】:

我一直在尝试从文件中读取输入并对其字符进行分类。打印文本文件中有多少个字符是大写字母、小写字母、数字、空格和其他内容。所以我一直在处理我的代码,但遇到了两个问题。

当我尝试关闭我的扫描仪时,我遇到了 java.lang.IllegalStateException:扫描仪已关闭。此外,我的代码产生了一个无限循环,但我已经看了好几个小时,但我不知道出了什么问题。我是 Java 的初学者,所以我还没有了解 hashmap 或 Buffered Readers。谢谢你的帮助。

这是我的代码:

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Characters

   public static void main(String[] args) throws FileNotFoundException
   
      Scanner console = new Scanner(System.in);
      System.out.print("Input file: ");
      String inputFileName = console.next();
      Scanner in = new Scanner(new File(inputFileName)); 

      while(in.hasNextLine())
      
          String line = in.nextLine(); 
          int len = line.length(); 
          int uppercase = 0 ;
          int lowercase = 0;
          int digits = 0;
          int whitespace = 0; 
          int other = 0; 

          for ( int i = 0 ; i < len ; i++)
          
              char c = line.charAt(i); 

          if (Character.isLowerCase(c))
          
              lowercase++; 
          
          else if (Character.isUpperCase(c))
          
              uppercase++;
          
          else if (Character.isDigit(c))
          
              digits++; 
          
          else if (Character.isWhitespace(c))
          
              whitespace++;
          
          else
              other++;
          

      System.out.println("Uppercase: " + uppercase);
      System.out.println("Lowercase: " + lowercase);
      System.out.println("Digits: " + digits);
      System.out.println("Whitespace: " + whitespace);
      System.out.println("Other: " + other);
      in.close();

   


   

【问题讨论】:

假设您将in.close() 移到while 循环之外。 【参考方案1】:

在扫描程序关闭后尝试执行搜索操作将导致 IllegalStateException。 您正在第一次迭代后立即关闭扫描仪(在读取第一行之后)

将 close() 方法移到 while 循环之外可以解决问题。

【讨论】:

【参考方案2】:

您应该使用 try-with-resouces 将 Scanner 关闭到 while 循环之外。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;

public class Characters 
    public static void main(String[] args) throws FileNotFoundException 
        Scanner console = new Scanner(System.in);
        System.out.print("Input file: ");
        String inputFileName = console.next();
        try (Scanner in = new Scanner(new File(inputFileName))) 
            while (in.hasNextLine()) 
                String line = in.nextLine();
                int len = line.length();
                int uppercase = 0;
                int lowercase = 0;
                int digits = 0;
                int whitespace = 0;
                int other = 0;

                for (int i = 0; i < len; i++) 
                    char c = line.charAt(i);

                    if (Character.isLowerCase(c)) 
                        lowercase++;
                     else if (Character.isUpperCase(c)) 
                        uppercase++;
                     else if (Character.isDigit(c)) 
                        digits++;
                     else if (Character.isWhitespace(c)) 
                        whitespace++;
                     else
                        other++;
                

                System.out.println("Uppercase: " + uppercase);
                System.out.println("Lowercase: " + lowercase);
                System.out.println("Digits: " + digits);
                System.out.println("Whitespace: " + whitespace);
                System.out.println("Other: " + other);
            
        

    

【讨论】:

是 try-with-resources 之类的 BufferedReader 吗? 是的。 Scanner 被 try-with-resouces 关闭,因为它实现了 Closeable【参考方案3】:

您似乎正在 while 循环中关闭扫描仪。你必须在循环之外关闭它。您会收到异常,因为在第一次循环迭代之后,扫描仪已关闭。

【讨论】:

【参考方案4】:

您应该在使用完扫描仪后关闭它。该示例让您在循环结束时关闭,因此它尝试在 while 条件中检查更多数据并失败。

尝试将 close 移动到 while 循环退出后。

【讨论】:

我尝试在 while 循环之外关闭扫描仪,但随后我得到一个无限循环。

以上是关于什么时候应该关闭扫描仪?的主要内容,如果未能解决你的问题,请参考以下文章

从扫描图像中捕获数据的工具 [关闭]

卖家使用iOS设备扫描买家的信用卡完成付款[关闭]

如何从浏览器应用程序控制扫描仪? [关闭]

PhoneGap 条码扫描器插件 - 相机关闭

如何在 .NET 中使用扫描仪? [关闭]

用于上传文件的防病毒扫描[关闭]