Java 中的新掃描器 NewScanner 介紹

一、引言

在 Java 程序中,讀取用戶輸入是一個重要的操作。Scanner 類是 Java 中讀取控制台輸入的標準類,但是它在處理輸入時有一些限制,比如只能按照空格或者回車分割輸入。為了克服這些限制,Java SE 8 引入了一個新的掃描器類 NewScanner,它可以更自由地處理用戶輸入。本文將介紹 Java 中的新掃描器 NewScanner 的使用方法和相應的例子。

二、NewScanner 類的概述

Java 中的新掃描器 NewScanner 是在 Java SE 8 中引入的。NewScanner 類提供了更靈活和方便的方法來讀取用戶輸入。它支持使用自定義分隔符、正則表達式、字符集等方式讀取輸入,這使得我們可以更好地處理用戶輸入。下面是 NewScanner 類的構造方法:

public NewScanner(InputStream source, String charsetName)
public NewScanner(InputStream source)
public NewScanner(Path source, Charset charset) throws IOException
public NewScanner(Path source) throws IOException
public NewScanner(Readable source)
public NewScanner(ReadableByteChannel source)
public NewScanner(SocketChannel source) throws IOException
public NewScanner(java.io.File file, String charsetName) throws FileNotFoundException
public NewScanner(java.io.File file) throws FileNotFoundException
public NewScanner(String source)

其中最常用的是傳入字元串或 System.in :

NewScanner scanner = new NewScanner(System.in);

三、NewScanner 類的方法

1. next() 方法

next() 方法會讀取輸入中的下一個字元串,並且自動跳過分隔符,直到下一個字元串。下面是 next() 方法的示常式序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);
        System.out.println("Enter your name: ");
        String name = scanner.next();
        System.out.println("Your name is " + name);
    }
}

當我們運行這個程序時,它會提示我們輸入名字。我們輸入 “Tom Jerry” 作為名字,程序只會輸出 “Your name is Tom”,而 “Jerry” 被忽略了,因為它使用空格作為分割符。

2. useDelimiter() 方法

useDelimiter() 方法用於設置分隔符,以便在讀取 input() 時使用。這個方法的默認分隔符是空格。下面是使用 useDelimiter() 方法的示常式序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);
        scanner.useDelimiter(",");
        System.out.println("Enter your name and age: ");
        String name = scanner.next();
        int age = scanner.nextInt();
        System.out.println("Your name is " + name.trim() + " and age is " + age);
    }
}

在這個程序中,我們使用 useDelimiter() 方法將逗號設置為分隔符,這意味著輸入中的字元串將在遇到逗號時被切分為不同的標記。這裡我們讀取了兩個標記:名字和年齡。如果我們輸入 “Tom, 20″,那麼程序會輸出 “Your name is Tom and age is 20″。

3. hasNext() 和 hasNextLine() 方法

hasNext() 和 hasNextLine() 方法都是用來檢測輸入中是否還有下一個標記。hasNext() 和 hasNextLine() 方法的主要區別是前者只檢查下一個標記是否存在,而後者則檢查整行是否輸入完畢。下面是使用這兩個方法的示常式序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        System.out.println("Enter your name: ");
        boolean inputIsString = scanner.hasNext();
        if (inputIsString) {
            String name = scanner.nextLine();
            System.out.println("Your name is " + name);
        }

        System.out.println("Enter your age: ");
        boolean inputIsInt = scanner.hasNextInt();
        if(inputIsInt) {
            int age = scanner.nextInt();
            System.out.println("Your age is " + age);
        }
    }
}

在這個程序中,我們使用了兩個方法:hasNext() 和 hasNextLine()。前者用於檢查是否有下一個標記,後者用於檢查是否有輸入行。如果輸入行中有多個標記,那麼第一個標記將被讀取並在第一次調用時返回 true。如果用戶輸入了一個字元串和一個整數 “Tom\n20″,那麼程序會輸出 “Your name is Tom” 和 “Your age is 20″。

4. reset() 方法

reset() 方法用於將 NewScanner 對象重置為原始狀態。這個方法可以用來重新掃描輸入,或者在重複使用 NewScanner 對象時進行處理。下面是使用 reset() 方法的示常式序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        System.out.println("Enter your name and age: ");
        String name = scanner.next();
        int age = scanner.nextInt();
        System.out.println("Your name is " + name + " and age is " + age);

        // Reset the scanner
        scanner.reset();
        scanner.useDelimiter(",");

        // Read two tokens
        System.out.println("Enter your name and age separated by a comma: ");
        String name2 = scanner.next();
        int age2 = scanner.nextInt();
        System.out.println("Your name is " + name2 + " and age is " + age2);
    }
}

在這個程序中,我們首先讀取了輸入中的兩個標記(名字和年齡),然後通過 reset() 方法將 NewScanner 對象重置為原始狀態。接下來,我們使用 useDelimiter() 方法將逗號設置為分隔符並再次讀取兩個標記。這裡,如果我們輸入 “Tom Jerry, 20″,那麼程序會輸出 “Your name is Tom Jerry and age is 20” 和 “Your name is Tom Jerry and age is 20″。

5. skip() 方法

skip() 方法用於跳過輸入中一定數量的位元組,從而允許我們跳過一些不必要的輸入。下面是使用 skip() 方法的示常式序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        while (true) {
            System.out.println("Enter your age: ");
            if (scanner.hasNextInt()) {
                int age = scanner.nextInt();
                System.out.println("Your age is " + age);
                break;
            }
            else {
                System.out.println("Invalid input");
                scanner.skip(".*\n");
            }
        }
    }
}

在這個程序中,我們使用了一個 while 循環以允許用戶多次輸入,直到輸入為整數。如果輸入不是整數,那麼程序將輸出 “Invalid input” 並使用 skip() 方法跳過整行輸入。這裡我們使用了一個正則表達式,即 .*,它匹配輸入行的任何內容。如果我們輸入了 “abc\n123″,那麼程序會輸出 “Invalid input” 和 “Your age is 123″。

6. findInLine() 方法

findInLine() 方法用於在當前行中查找指定的正則表達式。它類似於 nextLine() 方法,但是它只查找指定的正則表達式,並返回一個字元串。下面是使用 findInLine() 方法的示常式序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        String pattern = "\\w+"; //匹配單詞
        String input = "Hello, Java!";

        scanner = new NewScanner(input);
        System.out.println(scanner.findInLine(pattern)); // 輸出 Hello
    }
}

在這個程序中,我們使用了一個正則表達式,即 \\w+,它匹配輸入中的單詞。在這個例子中,我們將 input 設置為 “Hello, Java!”,然後使用 findInLine() 方法來查找單詞。如果我們運行這個程序,它會輸出 “Hello”。

四、小結

在本文中,我們介紹了 Java SE 8 中新掃描器 NewScanner 的使用方法和相應的例子。NewScanner 類提供了更靈活和方便的方法來讀取用戶輸入,它支持使用自定義分隔符、正則表達式、字符集等方式讀取輸入。我們介紹了 NewScanner 類的一些主要方法,包括 next() 方法、useDelimiter() 方法、hasNext() 和 hasNextLine() 方法、reset() 方法、skip() 方法和 findInLine() 方法。希望本文對你了解和使用 Java 中的新掃描器 NewScanner 有所幫助。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/291279.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 13:14
下一篇 2024-12-24 13:14

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論