nhập xuất dữ liệu trong java
Tung Bui Thanh (TungDaDev)10 mins read

Xin chào các bạn, chào mừng quay lại với series Thành thạo Java Basic trong 2 tuần. Nhắc lại chút: các bài trong series này nối tiếp nhau, không phải kiểu bài "ăn liền" như nhiều bài hướng dẫn Java khác, nên bạn cố theo dõi từ đầu thì học Java mới vào được.
Vào bài hôm nay luôn nào :v
# nhập xuất từ bàn phím
Từ hồi mới biết dùng máy tính, chắc chẳng ai sống thiếu được cái Keyboard 😂 Bàn phím là thứ để mình giao tiếp với máy tính, nên Java mà không hỗ trợ cái này thì thiếu sót to.
Quay lại ví dụ bài trước. Chương trình kiểm tra tam giác của mình còn cứng quá, muốn đổi a,b,c là phải sửa thẳng trong code.
Giờ mình nâng cấp bài toán một chút: "Nhận vào 3 số nguyên a,b,c từ bàn phím và kiểm tra nó là tam giác gì?"
Xem code trước, giải thích để ở dưới:
import java.util.Scanner;
public class Calculation {
public static void main(String[] args) {
// Chúng ta khai báo 3 biến a,b,c không có giá trị.
int a, b, c;
//Khai báo đối tượng Scanner, giúp chúng ta nhận thông tin từ keyboard
Scanner sc = new Scanner(System.in);
System.out.print("Nhập a: "); //print thay vì println, nó sẽ in ra, nhưng không xuống dòng
a = sc.nextInt(); // sc.nextInt() là cách để lấy giá trị từ bàn phím, nó sẽ chờ tới khi chúng ta nhập một số.
System.out.print("Nhập b: ");
b = sc.nextInt();
System.out.print("Nhập c: ");
c = sc.nextInt();
// In các giá trị ra màn hình
System.out.println("a = " + a + ", b = " + b + ", c = " + c);
// Đây là phép cộng String mình đã nói trong Bài #2.
}
}Chạy chương trình này, nó sẽ đứng lại ngay sau khi in ra Nhập a như thế này, con trỏ nhấp nháy chờ bạn:
Nhập a: █Sao vậy? 😕 Tại dòng a = sc.nextInt(). Nó đứng chờ tới khi bạn nhập 1 số nguyên rồi gõ Enter mới thôi. Giả sử mình nhập 5:
Nhập a: 5
Nhập b: █Chương trình chạy tiếp cho tới khi gặp sc.nextInt() kế tiếp, rồi lại chờ. Cứ thế cho tới dòng cuối.
Tới đây thì bạn hiểu rồi: đối tượng Scanner lo việc nhận dữ liệu người dùng gõ từ bàn phím, rồi gán vào biến qua lệnh nextInt.
Giờ ngó lại lên trên một chút, ở câu lệnh:
Scanner sc = new Scanner(System.in);bạn sẽ thấy chữ new. Cái này mấy bài sau mình nói kỹ, ở đây chỉ cần hiểu nó dùng để tạo ra 1 đối tượng Scanner, có nó rồi mới nhận được dữ liệu từ bàn phím. Còn dòng import java.util.Scanner; trên cùng thì bắt buộc phải có: Scanner nằm trong package java.util, thiếu import là code không biên dịch được (mấy ví dụ bên dưới mình lược phần import cho gọn).
# các phương thức nhập xuất
Tới đây bạn nhập được int từ bàn phím rồi, thế còn double hay String thì sao :3
Bạn nào gõ thử đoạn code trên rồi sẽ thấy ngay Scanner có cả loạt hàm như sau:
next(): Nhận vào mộtString token(nhận vào 1 từ đầu tiên thay cả câu)nextInt(): Nhận vào một sốintnextLong(): Nhận vào một sốlongnextFloat(): Nhận vào một sốfloatnextDouble(): Nhận vào một sốdoublenextLine(): Nhận vào mộtchuỗi String(Cả 1 câu)nextByte(): Nhận vào mộtbytenextBoolean(): Nhận vào mộtboolean
Nguyên lý chung: hàm nào cũng chờ tới khi bạn nhập xong và gõ Enter. Nhưng nó không kiên nhẫn chờ bạn nhập lại cho đúng đâu nhé: nextInt() mà bạn gõ abc thì chương trình văng lỗi InputMismatchException ngay. Muốn kiểm tra trước thì dùng mấy hàm hasNextInt(), hasNextDouble()...
Riêng next() và nextLine() hơi đặc biệt, xem ví dụ:
Scanner sc = new Scanner(System.in); //Tạo đối tượng Scanner
System.out.print("Nhập gì đó: ");
String a = sc.nextLine(); // nhận vào 1 string
System.out.println("Bạn vừa nhập: "+a);
System.out.print("Nhập thêm gì đi: ");
String b = sc.next(); // cũng nhận vào 1 String
System.out.println("Bạn vừa nhập: "+b);
Chạy thử xem sao, lần nào mình cũng gõ cùng một câu xin chao cac ban:
Nhập gì đó: xin chao cac ban
Bạn vừa nhập: xin chao cac ban
Nhập thêm gì đi: xin chao cac ban
Bạn vừa nhập: xinnextLine nhận nguyên cả chuỗi String cho tới khi bạn nhấn Enter. Còn next thì bạn gõ dài cỡ nào nó cũng chỉ lấy từ đầu tiên.
Có một cái bẫy kinh điển: gọi nextInt() xong rồi gọi nextLine() thì nextLine() trả về chuỗi rỗng luôn, không chờ bạn gõ. Lý do là nextInt() chỉ lấy con số, còn để lại ký tự xuống dòng (cái Enter bạn vừa gõ) trong bộ đệm, và nextLine() đọc tới ký tự đó là xong việc. Cách xử lý thường thấy là gọi thêm một sc.nextLine() để "nuốt" cái xuống dòng thừa đó trước. Bộ đệm là gì thì xuống dưới mình nói kỹ.
Okie, giờ dùng mấy cái này nâng cấp bài kiểm tra tam giác ở Bài #3 nhé.
class Calculation {
public static void main(String[] args) {
int a, b, c; // Khai báo 3 biến int, không cần giá trị.
Scanner sc = new Scanner(System.in); // Tạo đối tượng Scanner
System.out.print("Nhập a: ");
a = sc.nextInt();
System.out.print("Nhập b: ");
b = sc.nextInt();
System.out.print("Nhập c: ");
c = sc.nextInt();
if (laTamgiac(a,b,c)){
System.out.println("Là tam giác!");
if(laTamgiacDeu(a,b,c)){
System.out.println("Và còn đều nữa!");
// Là tam giác đều thì không cần kiếm tra điều kiện còn lại nữa.
}else {
if (laTamgiacVuong(a, b, c)) {
System.out.println("Và còn vuông nữa!");
// Không thể xảy ra vuông cân. Vì chúng ta đầu vào chỉ là số nguyên.
// Còn muốn đầy đủ, bạn phải kiểm tra trường hợp vừa vuông vừa cân nữa.
}
if (laTamgiacCan(a, b, c)) {
System.out.println("Và còn cân nữa!");
}
}
}else{
System.out.println("Không phải là tam giác!");
}
}
public static boolean laTamgiac(int a, int b, int c) {
if ((a + b) > c && (a + c) > b && (b + c) > a) {
// Tam giacs: tổng 2 cạnh phải lớn hơn cạnh còn lại
return true;
} else {
return false;
}
}
public static boolean laTamgiacVuong(int a, int b, int c){
if ((a*a + b*b) == c*c || (a*a + c*c) == b*b || (b*b + c*c) == a*a) {
// Là tam giác vuông nếu có 1 trong các đièu kiện thoả mãn pythagore.
return true;
} else {
return false;
}
}
public static boolean laTamgiacCan(int a, int b, int c){
if (a == b || b == c || c == a) {
return true;
}else{
return false;
}
}
public static boolean laTamgiacDeu(int a, int b, int c){
if (a == b && b == c) {
return true;
}else{
return false;
}
}
}Kết quả khi nhập bộ ba 3 4 5 quen thuộc:
Nhập a: 3
Nhập b: 4
Nhập c: 5
Là tam giác!
Và còn vuông nữa!Có một chuyện hay ho: nếu ngay ở câu Nhập a bạn gõ một lèo cả ba số, cách nhau bằng dấu cách, rồi mới Enter:
Nhập a: 3 4 5
Nhập b: Nhập c: Là tam giác!
Và còn vuông nữa!- Nó vẫn hiểu! Mà hình như còn bỏ qua luôn bước
nhập b và nhập c. - Sao lại thế? Tới đây phải nói kỹ hơn chuyện nhập từ bàn phím thật ra hoạt động thế nào.
# bản chất của next
Để ý là hàm lấy giá trị từ bàn phím nào cũng có chữ next. Chạy thử ví dụ này là hiểu:
public static void main(String[] args) {
int a,b,c;
Scanner sc = new Scanner(System.in); // Tạo đối tượng Scanner
System.out.print("Nhập a: ");
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();
System.out.println("a = "+a);
System.out.println("b = "+b);
System.out.println("c = "+c);
}Nó lấy lần lượt các giá trị bạn đã gõ để gán vào từng biến. Chữ next nghĩa là vậy: lấy cái tiếp theo. Chưa có gì thì nó chờ bạn nhập, còn nếu đã có sẵn giá trị thì nó giữ trong bộ đệm, tới nextInt() kế tiếp là khỏi chờ, lấy luôn giá trị còn dư gán vào biến 😂
Nhìn thế này cho dễ hiểu:
public static void main(String[] args) {
int a,b,c;
Scanner sc = new Scanner(System.in); // Tạo đối tượng Scanner
System.out.print("Nhập a: ");
a = sc.nextInt(); // Chờ bạn nhập.
// bạn nhập: 5 6 7 8 9 10
// bộ đệm = 5 6 7 8 9 10
// lấy 5 ra, gắn vào a
// bộ đệm còn: 6 7 8 9 10
b = sc.nextInt(); // gặp lệnh nextInt()
// thấy bộ đệm còn, lấy 6 ra, gắn vào b
// bộ đệm còn: 7 8 9 10
c = sc.nextInt(); // gặp lệnh nextInt()
// thấy bộ đệm còn thừa, lấy 7 ra, gắn vào c
// bộ đệm còn: 8 9 10
System.out.println("a = "+a); // in a
System.out.println("b = "+b); // in b
System.out.println("c = "+c); // in c
}# input/output từ file
Để đề phòng thế giới bị phá hoại... ==! lại xàm rồi
Ngoài bàn phím, đọc ghi dữ liệu từ file cũng là chuyện gặp suốt khi lập trình. Phần này không khác bàn phím mấy đâu, làm theo mình nhé.
Ở thư mục gốc của project, bạn click New > File, tạo 1 file tên input.txt. File phải nằm ngang hàng với thư mục src, chứ không nằm trong src:
my-project/
├── src/
│ └── Calculation.java
└── input.txtMở file ra, gõ dữ liệu vào dòng đầu tiên như này:
5 7 8Rồi quay lại code ở trên, sửa 1 dòng như sau:
public static void main(String[] args) throws FileNotFoundException { // Thêm cái này vào đây
int a,b,c;
Scanner sc = new Scanner(new File("input.txt")); // Tạo đối tượng Scanner đọc tới cái file vừa tạo
System.out.print("Nhập a: ");
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();
System.out.println("a = "+a); // in a
System.out.println("b = "+b); // in b
System.out.println("c = "+c); // in c
}
// Kết quả chạy:
// Nhập a: a = 5
// b = 7
// c = 8Nhớ import thêm java.io.File và java.io.FileNotFoundException nhé. File input.txt được tìm theo thư mục đang chạy chương trình (chạy trong IDE thì thường là thư mục gốc project), nên đặt sai chỗ là không thấy file.
Vậy thôi, đơn giản lắm. Chỉ có đoạn throws FileNotFoundException là bạn chưa biết, cái này vài bài nữa mình mới nói kỹ được. Tạm hiểu đây là lỗi có thể xảy ra: không tìm thấy file input.txt thì nó báo lỗi này. Xử lý lỗi để sau, giờ cứ gõ đúng tên file là không lỗi được :)))
Chu choa mạ ơi, tưởng nói xíu mà dài gớm :))) nhưng cơ bản thì nhập xuất dữ liệu là vậy đó các bạn 😂
Chúc các bạn học tốt! Nhớ share cho bạn bè học cùng nha :3
Chỉ là những ghi chép cá nhân với hy vọng mang lại chút giá trị. Nếu thấy hữu ích, đừng ngại chia sẻ cho bạn bè & đồng nghiệp nhé!
Happy coding 😎 👍🏻 🚀 🔥.