Scanner java là gì

Class java.util.Scanner là một class tiện ích cho phép nhập và nhận giá trị từ màn hình console. Để sử dụng Scanner chúng ta có thể khai báo như sau:

Scanner kbd = new Scanner[System.in];

Tuy nhiên, nếu bạn đang sử dụng Eclise IDE, nó sẽ xuất một thông báo liên quan đến rò rỉ bộ nhớ ‘kbd’ is never closed”.

Bạn có thể muốn loại bỏ cảnh báo này bằng cách gọi phương thức Scanner.close[] sau khi sử dụng xong. Dưới đây là một số cách mà mọi người hay làm để đóng Scanner object [lưu ý rằng đây là những điều bạn KHÔNG NÊN LÀM]:

Scanner kbd = new Scanner[System.in]; ... // code that uses kbd kbd.close[]; // Không nên làm điều này

Một số khác còn kỹ càng hơn, sử dụng try-finally để đảm bảo Scanner được đóng đúng cách.

Scanner kbd = new Scanner[System.in]; // Không nên làm điều này try { ... // code that uses kbd } finally { kbd.close[]; }

Hoặc thậm chí sử dụng tính năng try-with-resource để tự động đóng Scanner

// Không nên làm điều này try [Scanner kbd = new Scanner[System.in]] { ... // code that uses kbd }

Lý do chúng ta không nên làm những điều trên là vì đối tượng System.in được mở bởi JVM và nó nên được đóng bởi nó. Nếu bạn đóng nó, thì sau này các bạn sẽ không thể sử dụng lại đối tượng System.in.

Ví dụ đoạn code sau sẽ gây lại khi Scanner đã bị đóng, mà bạn lại sử dụng lại đối tượng System.in.

import java.io.IOException; import java.util.Scanner; class AssertDemo { public static void main[String[] args] throws IOException { Scanner scanner = new Scanner[System.in]; scanner.close[]; System.out.println[System.in.available[]]; } }

Output

Exception in thread "main" java.io.IOException: Stream closed

Làm sao để ẩn thông báo này?

Có một số cách để chúng ta có thể giải quyết trong trường hợp này:

1 – Bỏ qua thông báo này, nếu đã hiểu rõ vấn đề thì chúng ta hoàn toàn có thể bỏ qua thông báo này mà không cần xử lý thêm bất cứ điều gì. Tuy nhiên đối với những cảnh báo khác thì hãy nhớ xem xét nhé.

2 – Chặn cảnh báo bằng annotation. Bạn có thể sử dụng chú thích @SuppressWarnings [“resource”] để loại bỏ cảnh báo.

@SuppressWarnings["resource"] public static String getKeyboardInput[] { Scanner kbd = new Scanner[System.in]; ... }

Nhược điểm của cách này là khiến bạn phải sử dụng @SuppressWarnings ở rất nhiều nơi sử dụng Scanner object. Dẫn đến mã nguồn trở nên lộn xộn và mã xấu.

3 – Khai báo một biến static và sử dụng lại ở tất cả những nơi cần thiết. Bạn sẽ không nhận được cảnh báo về rò rỉ bộ nhớ khi không đóng Scanner object nếu khai báo nó là một biến statjc class. Việc này khiến cho mã nguồn của bạn có ý nghĩa hơn khi chúng ta chỉ cần khởi tạo Scanner một lần và sử dụng lại trong những lần khác, nơi khác.

public ConsoleProgram { public static final Scanner kbd = new Scanner[System.in]; }

Nguồn

//coderanch.com/wiki/678613/Don-close-Scanner-tied-System

Would love your thoughts, please comment.x

Mô hình Máy quét Java lớp được sử dụng để nhận đầu vào của người dùng từ các luồng khác nhau như đầu vào của người dùng, tệp và chuỗi đầu vào. Lớp này là một phần của gói java.util. Bằng cách sử dụng các phương thức tích hợp sẵn khác nhau, nó có thể đọc các loại đầu vào khác nhau.

Hoạt động của máy quét

Đối tượng máy quét đọc đầu vào và chia nó thành các mã thông báo dựa trên dấu phân cách thường là khoảng trắng. Sau đó, nó lặp lại qua từng mã thông báo không là gì khác ngoài từng dữ liệu bằng cách sử dụng các phương pháp tích hợp sẵn của nó. Ví dụ: hãy xem xét chuỗi đầu vào bên dưới

String s = "My age is 22";

Trong trường hợp này, nó chia chuỗi thành 4 mã thông báo “My”, “age”, “is”, “22” sử dụng khoảng trắng làm dấu phân cách.

Tạo một đối tượng Máy quét Java

Nhập Java máy quét

Để sử dụng lớp Máy quét Java, chúng tôi nhập java.util.Scanner gói hàng. Đoạn mã dưới đây cho bạn biết cách tạo một đối tượng máy quét với các luồng đầu vào khác nhau. Đối tượng đầu tiên sc đọc dữ liệu đầu vào từ đầu vào của người dùng mà có thể thông qua bàn phím. Đối tượng thứ 2 sc1 đọc đầu vào từ một hồ sơ và đối tượng thứ 3 sc2 đọc đầu vào từ một chuỗi.

//Read from user input Scanner sc = new Scanner[System.in]; //Read from file Scanner sc1 = new Scanner[File f]; //Read from string Scanner sc3 = new Scanner[String s];

Phương pháp máy quét để đọc các loại đầu vào khác nhau

Chúng ta có thể sử dụng các phương pháp dưới đây để đọc các loại đầu vào khác nhau và các thao tác khác

Phương phápMô tả
void close []Đóng đối tượng máy quét
Dấu phân cách mẫu []Trả về Mẫu của đối tượng máy quét mà nó hiện đang sử dụng để khớp với dấu phân cách
boolean hasNext []Trả về true nếu có một mã thông báo khác trong chuỗi đầu vào. Trả về một từ
boolean hasNext [Mẫu mẫu]Trả về true nếu mã thông báo tiếp theo khớp với mẫu được chỉ định
boolean hasNextBigDecimal []Trả về true nếu mã thông báo tiếp theo có BigDecimal
boolean HasNextBigInteger []Trả về true nếu mã thông báo tiếp theo có BigInteger
boolean hasNextBigInt []Trả về true nếu mã thông báo tiếp theo là BigInt
boolean HasNextBoolean []Trả về true nếu mã thông báo tiếp theo là boolean
boolean hasNextFloat []Trả về true nếu mã thông báo tiếp theo là Float
boolean hasNextDouble []Trả về true nếu mã thông báo tiếp theo là Double
boolean hasNextLine []Trả về true nếu máy quét có dòng nhập khác
Chuỗi tiếp theo []Tìm và trả về mã thông báo hoàn chỉnh tiếp theo trong đầu vào
BigDecimal nextBigDecimal []Trả về giá trị BigDecimal từ đầu vào
BigInteger nextBigInteger []Trả về giá trị BigInteger tiếp theo từ đầu vào
Double nextDouble []Trả về giá trị Double tiếp theo từ đầu vào
Float nextFloat []Trả về giá trị Float tiếp theo từ đầu vào
Int nextInt []Trả về số nguyên tiếp theo từ đầu vào
Dài tiếp theoLong []Trả về giá trị dài tiếp theo từ đầu vào
Chuỗi nextLine []Trả về dòng tiếp theo từ chuỗi đầu vào
Ngắn tiếp theoShort []Trả về giá trị ngắn tiếp theo từ chuỗi đầu vào

Java Scanner Exception

Lớp Java Scanner ném các ngoại lệ dưới đây trong khi cố gắng đọc đầu vào:

  • IllelgalStateException - khi chúng tôi cố gắng thực hiện hoạt động tìm kiếm trên đối tượng máy quét đóng
  • NoSuchElementException - khi không tìm thấy mã thông báo
  • InputMismatchException - khi đầu vào không khớp với kiểu mong đợi

Ví dụ về máy quét nextLine [] sử dụng System.in

Trong ví dụ dưới đây, chúng tôi đang tạo một đối tượng máy quét để đọc đầu vào của người dùng Java bằng cách sử dụng System.in không có gì khác ngoài đầu vào bàn phím. hàng tiếp theo[] phương thức đọc một dòng đầu vào cho đến khi nó gặp “\ n” [cuối dòng].

import java.util.Scanner; public class ScannerDemo1 { public static void main[String[] args] { System.out.println["Enter your name:"]; Scanner sc = new Scanner[System.in]; String s = sc.nextLine[]; System.out.println["Your name is " + s]; sc.close[]; } } Enter your name: Ravi Kumar Your name is Ravi Kumar

Ví dụ Java Scanner nextInt [] sử dụng System.in

Ở đây, chúng tôi sử dụng nextInt [] để đọc đầu vào giá trị số nguyên từ người dùng thông qua nhập bằng bàn phím. Do đó chúng tôi vượt qua System.in vào đối tượng máy quét.

import java.util.Scanner; public class ScannerDemo1 { public static void main[String[] args] { System.out.println["Enter your age:"]; Scanner sc = new Scanner[System.in]; int i = sc.nextInt[]; System.out.println["Your age is " + i]; sc.close[]; } } Enter your age: 35 Your age is 35

Ví dụ về Java Scanner next [] sử dụng đầu vào Chuỗi

Trong ví dụ dưới đây, chúng tôi sử dụng Chuỗi làm nguồn đầu vào. Chúng tôi chuyển nó cho đối tượng máy quét. Đọc Từng từ, chúng tôi sử dụng kế tiếp[] phương pháp. Phương pháp này theo mặc định sử dụng khoảng trắng làm dấu phân cách. Chúng tôi sử dụng hasNext [] phương pháp trong một trong khi lặp lại để nó in từng từ cho đến khi đến từ cuối cùng.

import java.util.Scanner; public class ScannerString { public static void main[String[] args] { String s = "Welcome to Java Programming"; Scanner sc = new Scanner[s]; while[sc.hasNext[]] { System.out.println[sc.next[]]; } sc.close[]; } } Welcome to Java Programming

Đọc đầu vào từ một tệp

Trong ví dụ này, chúng tôi sử dụng hồ sơ làm nguồn đầu vào và chuyển điều này làm tham số cho đối tượng máy quét java. Chúng ta có đã tạo một tập tin với nội dung có 2 dòng. Do đó sử dụng hasNextLine [] trong một trong khi lặp lại, chúng ta có thể đọc từng dòng riêng lẻ bằng cách sử dụng hàng tiếp theo[] cho đến khi nó đến dòng cuối cùng.

import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class ScannerFile { public static void main[String[] args] throws FileNotFoundException { File f = new File[filepath]; //Pass the filepath here Scanner sc = new Scanner[f]; while[sc.hasNextLine[]] { System.out.println[sc.nextLine[]]; } sc.close[]; } } Welcome to Java programming You will learn about Java Scanner class

Ví dụ về Java Scanner sử dụng dấu phân cách

Khi chúng tôi chuyển một chuỗi làm nguồn đầu vào cho đối tượng máy quét, chúng tôi có thể chỉ định dấu phân cách cho chia chuỗi thay vì sử dụng không gian mặc định. Trong ví dụ dưới đây, chúng tôi sử dụng “-” làm dấu phân cách.

import java.util.Scanner; public class ScannerString { public static void main[String[] args] { //String s = "Welcome to Java Programming"; String s = "This-is-an-example-of-using-delimiter"; Scanner sc = new Scanner[s].useDelimiter["-"]; while[sc.hasNext[]] { System.out.println[sc.next[]]; } } } This is an example of using delimiter

Kết luận

Trong hướng dẫn này, chúng ta đã tìm hiểu về máy quét Java và cách đọc các kiểu đầu vào khác nhau bằng các phương thức tích hợp của nó cùng với các ví dụ khác nhau.

Tài liệu tham khảo

Video liên quan

Chủ Đề