Nhập/Xuất Trên Console

1263

Bài viết được sự cho phép của tác giả Nhựt Danh

Bài viết hôm nay sẽ hướng dẫn bạn sử dụng một “công cụ” để các bạn tiến hành nhập/xuất thông qua Console. Công cụ này giúp cho các bạn sau khi nhập dữ liệu vào từ bàn phím, nó sẽ lấy dữ liệu được nhập này rồi sau đó chuyển vào chương trình của bạn, để chương trình xử lý, rồi xuất ra kết quả thông qua màn hình Console.

Sau bài học hôm nay thì các bạn có thể test thoải mái các dòng code, để hỗ trợ tốt vào quá trình học Java của bạn. Nhưng trước hết, chúng ta hãy cùng tìm hiểu sâu hơn về khái niệm nãy nhờ được nhắc đi nhắc lại này.

Khái Niệm Console

Đầu tiên bạn có thể hiểu Console chúng như là một bảng điều khiển chuyên dụng. Như các Game Console chính là các thiết bị chuyên cho việc điều khiển game. Hay các trang web quản lý như quản lý nhân viên cũng có thể coi là các Console chuyên dụng cho việc quản lý.

Trong ngôn ngữ lập trình, Console được biết đến như là một cách điều khiển ứng dụng đơn thuần nhất thông qua các dòng text (dòng lệnh), nó được phân biệt với điều khiển bằng UI.

Và Console trong chương trình học của chúng ta là hình minh họa dưới đây, ở các bài làm quen sơ sơ trước, khi bạn thực thi chương trình thì cũng đã biết tới cửa sổ Console này rồi đúng không nào.

Màn hình Console trong InteliJMàn hình Console trong InteliJ

Nhập Trên Consolse

Chúng ta đang nói đến các cách thức để bạn nhập dữ liệu từ Console. Để bắt đầu, bạn hãy mở InteliJ lên. Bạn hãy mở lại project HelloWord mà chúng ta đã tạo ra từ bài hôm trước.

Đầu tiên mình muốn bạn thử khai báo một đối tượng Scanner như code bên dưới. Bạn code đi rồi mình sẽ nói rõ hơn lý do tại sao phải code như vậy ở bên dưới dòng code này.

Scanner scanner = new Scanner(System.in);

Các khái niệm lớp (class) hay đối tượng gì gì đó thì bạn sẽ được làm quen sau này, nó thuộc về kiến thức OOP như mình có nói đến ở đầu bài học. Nhưng bạn có thể hiểu trước là đối tượng cũng giống như biến vậy, bạn có thể khai báo nó với cái tên tùy ý (theo quy tắc đặt tên của biến). Như ở trên chúng ta khai báo một đối tượng của Scanner mang tên là scanner. Chỉ khác biến ở chỗ là đối tượng của lớp phải được khởi tạo bằng từ khóa new như trên. Khi đó tổng thể code của bạn như sau.

public class MyFirstClass {

    public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
 }

}

  Console Javascript quá kinh khủng

  Cài Đặt Các Công Cụ Phát Triển Cho Java

Lan Man Về Cách Thức Bạn Code

Mục này cho phép mình nói lan man về kinh nghiệm code một tí xíu. Đó là nhiều bạn sau khi gõ xong dòng code trên đây, có thể sẽ có báo lỗi từ InteliJ như hình sau.

Khi bạn code có thể gặp tình huống báo lỗi như nàyKhi bạn code có thể gặp tình huống báo lỗi như này

Sở dĩ có báo lỗi là vì hệ thống đang không biết lớp Scanner là gì :)). Đó là bởi vì trước đây bạn chỉ sử dụng các biến nguyên thủy, hoặc các lớp nằm trong package java.lang. Với việc sử dụng này thì chúng ta không cần phải quan tâm, sẽ chẳng có lỗi nào như bạn đã từng thực hành với các bài học trước. Chà vậy chúng ta cần quan tâm gì? Thực ra trong Java, mỗi khi bạn code, bạn phải chỉ định nguồn gốc của các lớp bạn sẽ dùng, thông qua từ khóa import. Các dòng import được khai báo ở đầu mỗi file. Mỗi dòng import như vậy bao gồm từ khóa import, theo sau nó là package có chứa lớp cần dùng (bạn có thể xem thêm kiến thức về package ở đây).

Theo đó, ở ví dụ trên chúng ta cần đến lớp Scanner. Thì chúng ta cần import đúng package mà hệ thống muốn.

Để import đúng package có lớp Scanner cần dùng trên đây thực ra là một điều cực kỳ dễ dàng, có nhiều cách để thực hiện điều này, bạn hãy chọn một trong những cách sau.

Tham khảo việc làm Java hấp dẫn cho Fresher

Sử Dụng Gợi Ý Hoàn Thành Code Từ IDE

Có thể nói đây là cách thức dễ nhất để InteliJ tự động hoàn thành việc import một package cho bạn.

Việc của bạn là hãy gõ vài từ vào IDE, bạn sẽ thấy các gợi ý hoàn thành dòng code như hình bên dưới. Bạn hãy nhấn Enter nếu gợi ý đầu tiên bạn thấy là đúng, hoặc bạn có thể đưa vệt sáng đến dòng gợi ý nào khác rồi nhấn Enter. Ngoài việc kết quả dòng code được tự động hoàn thành thì hệ thống cũng import sẵn package java.util.Scanner cho bạn mà bạn không cần phải nhớ chúng là ai và từ đâu đến đúng không nào.

InteliJ tự gợi ý hoàn thành dòng code, và nếu bạn chấp nhận, nó cũng tự import package cho bạnInteliJ tự gợi ý hoàn thành dòng code, và nếu bạn chấp nhận, nó cũng tự import package cho bạn

Bạn thử gõ hết câu lệnh trên với việc chọn những gợi ý ở các thành phần tiếp theo (scannernewScannerSystem) xem sao nhé. Kết quả sẽ không còn lỗi nữa.

Kêu IDE Import Giúp

Có đôi khi IDE không đưa ra bất kì gợi ý nào để hoàn thành dòng code như trên kia. Khi này bạn hãy cứ gõ hết tất cả dòng code cần thiết của bạn, đừng lo lắng nếu có báo lỗi. Sau khi gõ xong hết, thì bạn cứ để ý trên editor của IDE, chắc chắn sẽ xuất hiện các hướng dẫn tận tình giúp chúng ta sửa lỗi.

Như trường hợp dưới đây, sau khi gõ xong, bạn sẽ thấy các nơi báo đỏ, khi đưa con trỏ chuột vào những nơi bị tô đỏ đó, nếu là lỗi thiếu import, bạn sẽ nhìn thấy một popup hiện ra như thế này, chỉ cần nhấn chọn vào chữ Import Class là xong.

Sử dụng gợi ý import từ InteliJSử dụng gợi ý import từ InteliJ

Import Thủ Công

Tất nhiên cách này dành cho bạn nào biết chính xác lớp này nằm trong package nào rồi nên bạn có thể gõ import một cách thủ công.


Lan man hơi dài rồi, quay trở lại với việc bạn vừa khai báo đối tượng của lớp Scanner trên kia. Dòng tiếp theo bạn chỉ cần gọi

scanner.nextXxx();

 thì khi bạn chạy chương trình, khi hệ thống thực thi đến dòng này, nó sẽ dừng lại chờ, và lúc đó Console sẽ xuất hiện con nháy chờ người dùng nhập vào một giá trị có kiểu dữ liệu là Xxx rồi mới tiến hành gán giá trị này vào biến tương ứng và thực hiện tiếp các câu lệnh bên dưới.

Bạn hãy thử vài ví dụ sau cho từng

scanner.nextXxx();

 cụ thể nhé.

Ví Dụ Nhập Dữ Liệu Kiểu Chuỗi

Với ví dụ này bạn thử cho người dùng nhập vào tên từ Console rồi in ra dòng xin chào ngay trên Console luôn như sau.

Để đợi người dùng nhập vào tên bạn gõ dòng sau vào sau khi khai báo scanner.

String name = scanner.nextLine();

Khi đó tên người dùng nhập vào từ Console sẽ được gán vào biến kiểu String (đây là kiểu chuỗi mà bạn sẽ được làm quen sau) có tên là name. Nhưng để dễ dàng hơn cho người dùng, chúng ta nên có các dòng System.out để in ra chỉ dẫn cho người dùng trước dòng đợi nhập tên. Code tổng thể của chúng ta như sau.

import java.util.Scanner;;

public class MyFirstClass {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Please enter your name here: ");
        String name = scanner.nextLine();
        System.out.println("Hello! " + name);
    }

}

Khi này nếu bạn chạy chương trình, chỉ có dòng text “Please enter your name here: “ xuất hiện, đừng tắt cửa sổ Console nhé, hãy tiếp tục nhập vào một text, sau khi Enter bạn sẽ nhận được một text nữa in ra với nội dung “Hello!” và text bạn vừa nhập, text in ra đó chính là nội dung biến name được scanner lấy dữ liệu từ Console rồi gán vào đấy.

Kết quả thực thi chương trình khi nhập vào một StringKết quả thực thi chương trình khi nhập vào một String

Ví Dụ Nhập Dữ Liệu Kiểu int

Tương tự nếu ví dụ này hỏi người dùng nhập tuổi, bạn cũng nên có câu in ra gợi ý, dòng scanner.nextInt(), và dòng in ra kết quả sau đó. Code tổng thể như sau.

Scanner scanner = new Scanner(System.in);
System.out.println("How old are you? ");
int age = scanner.nextInt();
System.out.println("Your age is: " + age);

Ví Dụ Nhập Dữ Liệu Kiểu Float

Scanner hỗ trợ nhập cho hầu như tất cả các kiểu dữ liệu nguyên thủy (trừ kiểu char, vì thực ra kiểu char cũng có thể lấy ra từ việc nhập một String với một ký tự, bạn hãy xem phần bình luận bên dưới để biết cách nhập vào kiểu char nếu có nhu cầu nhé). Ví dụ sau nhập vào kiểu float và bạn hoàn toàn có thể áp dụng cho các kiểu dữ liệu nguyên thủy được hỗ trợ còn lại.

Scanner scanner = new Scanner(System.in);
System.out.println("How about your salary? ");
float salary = scanner.nextFloat();
System.out.println("Your salary is: " + salary);

Xuất Trên Console

Chắc bạn cũng biết, để xuất dữ liệu ra Console thì cứ gọi

System.out.println();

 thôi chứ gì. Dễ quá, các bài trước và bài hôm nay bạn đã làm quen rồi. Nhưng kiến thức về xuất dữ liệu ra Console còn vài thứ vui vẻ nữa, mời các bạn cùng xem tiếp.

Xuất Mặc Định

Mình dùng từ xuất mặc định là bởi vì chúng ta không can thiệp gì đến cách mà Console hiển thị một nội dung cả. Đó chính xác là cách gọi

System.out.println();

 như chúng ta đã làm quen. Mình thêm một vài lưu ý sau thôi.

  • Bạn có thể dùng câu lệnh print() thay vì println(). Nếu như với println() thì các bạn đã biết nó giúp xuất dữ liệu ra rồi kèm theo xuống hàng sau khi xuất. Thì print() chỉ xuất dữ liệu thôi và không xuống hàng. Bạn có thể thử áp dụng print() cho các thông báo chỉ dẫn như “Please enter your name here: “ trên kia để xem sự khác biệt nhé.
  • Nếu bạn muốn hiển thị các ký tự đặc biệt sau: dấu nháy đơn (‘), dấu nháy kép (“), và dấu gạch chéo (). Thì bạn cứ kèm theo một gạch chéo () nữa ở trước các ký tự này. Chẳng hạn bạn muốn hiển thị dòng Thư mục chứa file “ấy” là C:LocationAy, thì bạn gõ lệnh xất như sau System.out.print(“Thư mục chứa file ”ấy” là C:LocationAy”);.
  • Ngoài ra bạn còn có thể chèn thêm các ký tự giúp định dạng dữ liệu xuất, như “t” sẽ chèn thêm một tab, hay “n” sẽ giúp xuống dòng. Bạn thử tự kiểm chứng bằng cách gõ xòng lệnh này nhé System.out.print(“tHellonWorld”);.

Tuy nhiên, với kiểu xuất mặc định này, có đôi lúc chúng ta tưởng như việc xuất nội dung là bình thường, nhưng nó lạ lắm. Bạn hãy xem kết quả in ra Console bên dưới đây, rồi chúng ta sẽ xem xuất “không mặc định” nó sẽ như thế nào sau nhé.

double x = 10000.0/3.0;
System.out.println("The result is " + x);

Kết quả sẽ in ra nội dung

The result is 3333.3333333333335

. Thì cũng đúng thôi, kết quả phép chia cho ra dãy số vậy là đúng rồi. Thế nhưng nếu chúng ta muốn kiểm soát việc in ra Console sao cho dữ liệu xuất được đẹp hơn thì sao. Chẳng hạn bạn muốn in ra giá trị cho tiền tệ, khi mà sau dấu thập phân bạn muốn làm tròn đến 2 con số thôi. Khi đó bạn hãy đến với kiến thức về xuất theo định dạng như sau.

Xuất Theo Định Dạng

Nếu như với xuất mặc định, bạn đã biết là nên dùng một trong hai phương thức là print() hay println(). Thì xuất theo định dạng cung cấp cho bạn một phương thức hiệu quả hơn đó là printf() (chữ f cuối cùng của phương thức viết tắt của từ format, chính là định dạng).

Khi đó để kết quả của ví dụ trên in ra một con số làm tròn “đẹp đẽ” sao cho chỉ có 2 chữ số sau dấu thập phân thôi, bạn có thể viết lại như sau.

double x = 10000.0/3.0;
System.out.printf("The result is %.2f", x);

Kết quả in ra là:

The result is 3333.33

. Đẹp hơn đúng không nào, mình giải thích sơ qua cho các bạn hiểu cách làm việc của printf() ở bên dưới (nếu bạn nào muốn tìm hiểu kỹ hơn tất cả cách sử dụng của printf() thì có thể đọc bài viết này của mình).

printf() ở mức cơ bản cần bạn phải truyền vào 2 thành phần, cách nhau bởi dấu (,).

  • Thành phần thứ nhất nói cho phương thức này biết nội dung xuất ra màn hình, trong nội dung đó có chỉ định một hoặc nhiều dấu hiệu định dạng. Trong ví dụ trên thì dấu hiệu này là %10.2fDấu hiệu định dạng này mang ý nghĩa rằng bạn muốn in một số thực bất kỳ, nhưng nó phải được hiển thị bởi ký tự sau dấu thập phân.
  • Thành phần thứ hai của phương thức chính là giá trị cần định dạng. Hệ thống sẽ tự động tìm kiếm nơi mà bạn đã khai báo dấu hiệu định dạng trong chuỗi xuất ở thành phần thứ nhất, cụ thể là %10.2f như bạn thấy, và thay thế vào đó giá trị cần định dạng, cụ thể là biến x của chúng ta.

Kết Luận

Chúng ta vừa thực hành các câu lệnh nhập/xuất đáng giá từ console. Bạn đã đủ tự tin để nhập bất kỳ dữ liệu bạn muốn vào chương trình, và xuất dữ liệu một cách đẹp đẽ ra console rồi. Hãy đến các bài viết tiếp theo của mình để cùng nhau từng bước xây dựng các ứng dụng hoàn chỉnh nhé.

Bài viết gốc được đăng tải tại yellowcodebooks.com

Xem thêm:

Đừng bỏ qua việc làm IT tất cả level có trên TopDev nhé!