杰瑞科技汇

java scanner 结束输入

在 Java 中,使用 Scanner 结束输入通常有几种方法,具体取决于你的输入源(控制台、文件等)以及你希望如何判断输入的结束。

java scanner 结束输入-图1
(图片来源网络,侵删)

下面我将详细讲解最常用的几种场景,并提供代码示例。

从控制台读取,直到用户输入特定内容(如 "exit")

这是最常见的需求之一,程序会一直等待用户输入,直到用户输入一个预设的结束标志("exit"、"quit" 或 "q")。

方法:使用 Scanner.hasNext() 循环

我们可以让 Scanner 不断地读取下一行,并在循环内部判断当前输入的内容是否为结束标志。

代码示例:

java scanner 结束输入-图2
(图片来源网络,侵删)
import java.util.Scanner;
public class ScannerExitExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入内容,输入 'exit' 结束:");
        // 使用 hasNext() 循环,它会一直等待,直到没有输入了才返回 false
        // 但对于控制台输入,它永远不会主动结束,所以我们用 break 来控制
        while (true) {
            // 检查是否有下一行输入
            if (scanner.hasNextLine()) {
                String input = scanner.nextLine();
                // 判断是否为结束标志
                if ("exit".equalsIgnoreCase(input)) {
                    System.out.println("程序结束。");
                    break; // 退出循环
                }
                // 处理输入
                System.out.println("你输入了: " + input);
            }
        }
        scanner.close(); // 关闭 Scanner,释放资源
    }
}

代码解释:

  1. Scanner scanner = new Scanner(System.in); 创建一个从标准输入(键盘)读取的 Scanner 对象。
  2. while (true) 创建一个无限循环,程序会一直等待用户输入。
  3. scanner.hasNextLine() 检查是否还有下一行可读,对于控制台,只要用户按下回车,它就会返回 true
  4. scanner.nextLine() 读取整行输入(包括空格),直到遇到换行符。
  5. if ("exit".equalsIgnoreCase(input)) 检查用户输入的内容是否是 "exit"(不区分大小写)。
  6. 如果是,则打印结束信息,并用 break 退出 while 循环。
  7. scanner.close(); 非常重要!它会关闭 Scanner 并释放其占用的系统资源(如标准输入流),如果不关闭,可能会导致资源泄漏。

从控制台读取,直到遇到文件结束符(EOF - End-of-File)

在某些操作系统(如 Linux/macOS)中,你可以通过按 Ctrl+D 来发送一个文件结束符(EOF),在 Windows 中,可以使用 Ctrl+Z 然后按回车。

Scanner 可以自动检测到这个信号并停止。

方法:使用 Scanner.hasNext() 循环

Scanner.hasNext() 方法在遇到 EOF 时会返回 false,我们可以利用这一点来结束循环。

java scanner 结束输入-图3
(图片来源网络,侵删)

代码示例:

import java.util.Scanner;
public class ScannerEOFExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入内容(在 Linux/macOS 按 Ctrl+D,在 Windows 按 Ctrl+Z 结束):");
        // hasNext() 会持续读取,直到遇到 EOF 或没有更多输入
        while (scanner.hasNext()) {
            // 注意:这里用 next() 会按空格/制表符/换行符分割单词
            // 如果想按行读,应该用 hasNextLine() 和 nextLine()
            String word = scanner.next();
            System.out.println("你输入了单词: " + word);
        }
        System.out.println("检测到输入结束(EOF)。");
        scanner.close();
    }
}

代码解释:

  1. while (scanner.hasNext()) 这个循环会一直执行,只要 Scanner 能够读取到下一个令牌(token,默认是空格分隔的单词)。
  2. 当用户输入 EOF 信号后,scanner.hasNext() 会返回 false,循环自动终止。
  3. 注意scanner.next() 读取的是单词,如果你想读取整行,应该像场景一那样使用 hasNextLine()nextLine()

从文件读取,直到文件末尾

这是 Scanner 的一个核心功能,读取文件时,Scanner 会自动在到达文件末尾时停止。

方法:直接使用 while (scanner.hasNext()) 循环

代码示例:

假设你有一个名为 input.txt 的文件,内容如下:

Hello World
This is a test.
Java Scanner is powerful.

Java 代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerFileExample {
    public static void main(String[] args) {
        try {
            File myFile = new File("input.txt");
            Scanner scanner = new Scanner(myFile);
            System.out.println("开始读取文件内容:");
            // 当文件没有更多内容时,hasNext() 会返回 false
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                System.out.println(line);
            }
            System.out.println("文件读取完毕。");
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("错误:找不到文件 input.txt");
            e.printStackTrace();
        }
    }
}

代码解释:

  1. new File("input.txt") 创建一个 File 对象。
  2. new Scanner(myFile) 创建一个从该文件读取的 Scanner
  3. while (scanner.hasNextLine()) 循环会逐行读取文件,当 Scanner 读取到文件的最后一行之后,再调用 hasNextLine() 会返回 false,循环结束。
  4. try-catch 块是必须的,因为文件可能不存在,Scanner 的构造函数会抛出 FileNotFoundException
  5. 同样,scanner.close() 用于关闭文件,释放资源。

总结与最佳实践

场景 推荐方法 结束条件
控制台交互 while (true) + break 用户输入特定字符串(如 "exit")
控制台读取EOF while (scanner.hasNext()) 用户发送EOF信号(Ctrl+D / Ctrl+Z
文件读取 while (scanner.hasNextLine()) 到达文件物理末尾

核心要点:

  1. next() vs nextLine():

    • next(): 读取下一个单词(以空白符为分隔符)。
    • nextLine(): 读取一整行(以换行符为分隔符)。
    • 根据你的需求选择合适的方法。
  2. hasNext() vs hasNextLine():

    • hasNext(): 检查是否有下一个单词
    • hasNextLine(): 检查是否有下一行
    • 它们分别与 next()nextLine() 配对使用。
  3. Scanner.close():

    • 务必在使用完 Scanner 后调用 close() 方法,尤其是在读取文件时,这会释放底层的 I/O 资源,防止资源泄漏。
    • 对于控制台输入,虽然程序结束后系统会回收资源,但养成良好习惯总是好的,在更复杂的程序中,不关闭可能导致问题。
  4. try-with-resources (Java 7+ 推荐): 为了避免忘记关闭 Scanner,可以使用 try-with-resources 语句,它会自动关闭实现了 AutoCloseable 接口(Scanner 实现了该接口)的资源。

    示例(文件读取):

    try (Scanner scanner = new Scanner(new File("input.txt"))) {
        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    // 不需要写 scanner.close(),try-with-resources 会自动处理
分享:
扫描分享到社交APP
上一篇
下一篇