JavaRush /Blog Java /Random-VI /Lớp máy quét trong Java

Lớp máy quét trong Java

Xuất bản trong nhóm
Xin chào! Bài học hôm nay của chúng ta sẽ rất đặc biệt! Trước đó, khi giải quyết vấn đề và viết chương trình, thuật toán rất đơn giản: chúng ta viết một số mã, chạy phương thức main() , chương trình thực hiện những gì được yêu cầu và thoát. Nhưng bây giờ mọi thứ sẽ thay đổi! Hôm nay chúng ta sẽ học cách tương tác thực sự với chương trình: chúng ta sẽ dạy nó cách phản ứng lại hành động của chúng ta! Bạn có thể đã hiểu chúng ta đang đi đâu với điều này. Chúng tôi sẽ dành bài giảng này để phân tích chi tiết về một trong các lớp ngôn ngữ Java – Máy quét. Lớp này sẽ hữu ích nếu bạn cần đọc dữ liệu mà người dùng nhập vào. Trước khi chúng ta chuyển sang học mã, hãy cho tôi biết, bạn đã bao giờ gặp một thiết bị như máy quét chưa? Chắc chắn là có. Cấu trúc bên trong của máy quét khá phức tạp, nhưng bản chất công việc của nó khá đơn giản: nó đọc dữ liệu mà người dùng nhập vào (ví dụ: hộ chiếu hoặc hợp đồng bảo hiểm) và lưu trữ thông tin đã đọc vào bộ nhớ (ví dụ: , ở dạng hình ảnh). Vì vậy, hôm nay bạn sẽ tạo máy quét của riêng mình! Tất nhiên, anh ấy không thể xử lý tài liệu, nhưng anh ấy có thể xử lý thông tin văn bản khá tốt :) Đi thôi!Lớp máy quét - 1

Lớp máy quét Java

Điều đầu tiên và quan trọng nhất chúng ta cần làm quen là lớp java.util.Scanner. Chức năng của nó rất đơn giản. Giống như một máy quét thực sự, nó đọc dữ liệu từ nguồn bạn chỉ định cho nó. Ví dụ: từ một dòng, từ một tệp, từ bảng điều khiển. Sau đó, nó nhận ra thông tin này và xử lý nó khi cần thiết. Hãy đưa ra ví dụ đơn giản nhất:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Chúng tôi đã tạo một đối tượng máy quét và chỉ định nguồn dữ liệu cho nó (một chuỗi có văn bản). Phương thức này nextLine()truy cập vào nguồn dữ liệu (văn bản của chúng tôi có quatrain), tìm thấy dòng tiếp theo mà nó chưa đọc (trong trường hợp của chúng tôi là dòng đầu tiên) và trả về nó. Sau đó, chúng tôi xuất nó ra bàn điều khiển: Đầu ra của bàn điều khiển:

Люблю тебя, Peterа творенье,
Chúng ta có thể sử dụng phương pháp này nextLine()nhiều lần và xuất ra toàn bộ đoạn thơ:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
Mỗi lần máy quét của chúng tôi sẽ tiến lên một bước và đọc dòng tiếp theo. Kết quả của chương trình được xuất ra console:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Như chúng tôi đã nói, nguồn dữ liệu cho máy quét không chỉ có thể là một chuỗi mà còn có thể là một bảng điều khiển chẳng hạn. Tin quan trọng đối với chúng tôi: nếu trước đây chúng tôi chỉ xuất dữ liệu ở đó thì bây giờ chúng tôi sẽ nhập dữ liệu từ bàn phím! Hãy xem lớp Scanner có thể làm gì khác :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
Phương thức nextInt()đọc và trả về số đã nhập. Trong chương trình của chúng tôi, nó được sử dụng để gán giá trị cho một biến number. Cái này trông giống một máy quét thực sự hơn! Chương trình yêu cầu người dùng nhập số bất kỳ vào một dòng. Sau khi người dùng thực hiện xong việc này, chương trình sẽ cảm ơn anh ta, hiển thị kết quả công việc của nó trên bảng điều khiển và kết thúc. Nhưng chúng ta vẫn còn một vấn đề nghiêm trọng. Người dùng có thể mắc lỗi và nhập sai nội dung nào đó. Đây là ví dụ về thời điểm chương trình hiện tại của chúng tôi ngừng hoạt động:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
Hãy thử nhập chuỗi “JavaRush” thay vì một số: Đầu ra của bảng điều khiển:
Enter the number:
JavaRush
Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:864)
  at java.util.Scanner.next(Scanner.java:1485)
  at java.util.Scanner.nextInt(Scanner.java:2117)
  at java.util.Scanner.nextInt(Scanner.java:2076)
  at Main.main(Main.java:10)

Process finished with exit code 1
Rất tiếc, mọi thứ đều tệ -_- Để tránh những tình huống như vậy, chúng ta cần nghĩ ra cách xác thực dữ liệu mà người dùng nhập vào. Ví dụ: người dùng nhập bất kỳ thứ gì không phải là số, sẽ rất tốt nếu hiển thị cảnh báo trong bảng điều khiển rằng thông tin đã nhập không phải là số và nếu mọi thứ đều đúng thứ tự, hãy hiển thị văn bản xác nhận. Nhưng để làm được điều này, chúng ta thực sự cần phải “nhìn về tương lai” - tìm hiểu xem điều gì sẽ xảy ra tiếp theo trong dòng chảy của chúng ta. Máy quét trong Java có thể làm được điều này không? Làm sao anh ta có thể! Và để làm được điều này, nó có cả một nhóm phương thức: hasNextInt()- phương thức này kiểm tra xem phần tiếp theo của dữ liệu đã nhập có phải là số hay không (trả về đúng hoặc sai tương ứng). hasNextLine()— kiểm tra xem phần dữ liệu tiếp theo có phải là một chuỗi hay không. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat()- hasNextDouble()tất cả các phương thức này đều thực hiện tương tự đối với các kiểu dữ liệu khác. Hãy thử thay đổi chương trình của chúng ta để đọc số:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thank you! You entered a number" + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Bây giờ chương trình của chúng ta kiểm tra xem ký tự tiếp theo được nhập có phải là số hay không. Và chỉ nếu có, nó sẽ hiển thị xác nhận. Nếu đầu vào không vượt qua bài kiểm tra, chương trình sẽ thông báo điều này và yêu cầu bạn thử lại. Về cơ bản, bạn có thể giao tiếp với đối tượng Máy quét và biết trước loại dữ liệu sẽ nhận được. “Này, máy quét, tiếp theo là gì? Số, chuỗi, hay cái gì khác? Con số? Và cái nào - int, short, long?” Tính linh hoạt này mang lại cho bạn cơ hội xây dựng logic của chương trình tùy thuộc vào hành vi của người dùng. Một phương pháp quan trọng khác đáng được chú ý là useDelimiter(). Phương thức này được truyền vào chuỗi mà bạn muốn sử dụng làm dấu phân cách. Ví dụ, chúng tôi đột nhiên quan tâm đến thơ Nhật Bản và quyết định sử dụng máy quét để đọc một vài bài thơ haiku của nhà thơ vĩ đại Matsuo Basho. Ngay cả khi ba câu thơ khác nhau được trao cho chúng ta trong một dòng vụng về, chúng ta có thể dễ dàng tách chúng ra và định dạng chúng một cách đẹp mắt:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
Chúng tôi sử dụng phương thức useDelimeter() của lớp Scanner làm dấu tách dòng : nó chịu trách nhiệm chia dữ liệu đến thành các phần. Trong trường hợp của chúng tôi, một trích dẫn ( "'" ) được chuyển làm đối số và được sử dụng để phân tách các chuỗi . Văn bản theo sau trích dẫn này xuất hiện trên một dòng mới vì trong vòng lặp while chúng ta đang sử dụng phương thức println() của lớp System để đọc dữ liệu. Kết quả là chúng ta sẽ có một kết quả đầu ra đẹp mắt trong bảng điều khiển, giống như trong sách:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Trong ví dụ tương tự, có một phương pháp nữa mà bạn chắc chắn nên chú ý - close(). Giống như bất kỳ đối tượng nào hoạt động với luồng I/O, máy quét phải được đóng khi công việc của nó hoàn thành để nó không còn tiêu tốn tài nguyên máy tính của chúng ta nữa. Đừng bao giờ quên phương pháp close()!
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
Đó là tất cả! Như bạn có thể thấy, lớp Scanner khá dễ sử dụng và rất hữu ích! :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION