Làm việc với thiết bị nhập/xuất chuẩn (I/O devices)

Xuất dữ liệu

Một chương trình sẽ thực hiện 3 thao tác cơ bản: nhận dữ liệu, xử lý dữ liệu và xuất kết quả. Trong các chương trình Java đầu tiên, chúng ta đã làm quen với đối tượng xuất dữ liệu đến thiết bị chuẩn (cụ thể là màn hình) là System.out và các phương thức xuất dữ liệu cơ bản là printprintln. Tuy nhiên, printprintln có một số hạn chế trong vấn đề định dạng dữ liệu như ví dụ sau:


double PI = (double) 3.14f;

System.out.println("PI = " + PI);

Kết quả:


PI = 3.140000104904175

Giả sử chúng ta muốn hiển thị giá trị biến PI = 3.14, tức là chỉ cần hai chữ số phần thập phân thì print hay println sẽ không giải quyết được. May mắn thay, đối tượng System.out có hỗ trợ phương thức printf giúp chúng ta định dạng dữ liệu như ý muốn.

Phương thức printf có thể được sử dụng theo hai cách là:

hay

Ví dụ biến PI có thể viết lại như sau:


double PI = (double) 3.14f;

System.out.printf("PI = %.2f", PI);

Kết quả:


PI = 3.14

Học cách sử dụng printf tại Java docs. Bên cạnh printf, chúng ta cũng có thể dùng phương thức format của lớp String. Có thể học về phương thức format tại DZone.

Chú ý: chúng ta nên chọn phiên bản Java 5 trở lên để printf không bị lỗi bằng cách vào Project > Properties > Java Compiler. Tại JDK Compliance, nhấp chuột vào checkbox Use compliance from… và chọn phiên bản phù hợp:

Nhớ chọn Apply trước khi đóng hộp thoại.

Nhập dữ liệu

Để nhập dữ liệu từ thiết bị nhập chuẩn (như bàn phím,…), Java cung cấp lớp Scanner. Để dùng lớp này, đầu tiên chúng ta phải tạo một đối tượng nhập (ví dụ console) và kết nối nó với thiết bị nhập chuẩn như đoạn mã sau:


Scanner console = new Scanner(System.in);

Để sử dụng lớp Scanner chúng ta cần import lớp Scanner đến dự án:


import java.util.Scanner;

Sau khi tạo đối tượng từ lớp Scanner, chúng ta sẽ sử dụng các phương thức của lớp Scanner để nhận dữ liệu từ thiết bị nhập chuẩn. Một số phương thức phổ biến:

Phương thức Mô tả Ví dụ
nextInt() Nhận số nguyên int a = console.nextInt();
nextDouble() Nhận số thực double b = console.nextDouble();
next() Nhận một chuỗi ký tự String str = console.next();
nextLine() Nhận một chuỗi ký tự trên dòng kế tiếp String str = console.nextLine();
next().charAt(0) Nhận một ký tự char ch = console.next().charAt(0);

Ngoài các phương thức trên, lớp Scanner còn cung cấp nhiều phương thức khác có thể xem chi tiết tại tutorialspoint.

Chương trình sau đây sẽ minh họa cách tính tổng hai số nguyên được nhập từ bàn phím và hiển thị tổng đó ra màn hình:


Scanner console = new Scanner(System.in);

System.out.print("Enter a = ");

int a = console.nextInt();

System.out.print("Enter b = ");

int b = console.nextInt();

System.out.println();

int c = a + b;

System.out.printf("a + b = %d", c);

Khi hoàn thành có thể đóng đối tượng Scanner để tránh rò rỉ bộ nhớ:


if(console != null)

console.close();

Làm việc với các hộp thoại (Dialog boxes)

Một cách khác để nhập/xuất dữ liệu trong Java là sử dụng lớp JOptionPane cho phép thực hiện nhập/xuất dữ liệu qua giao diện đồ họa hay các hộp thoại chuẩn. Lớp này được chứa trong gói javax.swing. Hai phương thức được dùng phổ biến trong lớp JOptionPaneshowInputDialog cho phép người dùng nhập dữ liệu từ bàn phím và showMessageDialog cho phép hiển thị kết quả.

Cú pháp của phương thức showInputDialog

stringExpression là chuỗi thông điệp chúng ta muốn hiển thị trên hộp thoại, biến str kiểu String chứa giá trị được nhập từ bàn phím. Đoạn mã sau minh họa cách dùng phương thức showInputDialog:


String name = JOptionPane.showInputDialog("Enter your name and press OK");

System.out.printf("Hello %s", name);

Lưu ý chúng ta cần import lớp JOptionPane:


import javax.swing.JOptionPane;

Kết quả:

Nếu nhập dữ liệu như sau:

Nhấp OK thì kết quả là:

Hello Minh

Cú pháp của phương thức showMessageDialog:

Các tham số của phương thức showMessageBox có thể được mô tả như sau:

Tham số Mô tả
parentComponent Đối tượng cha của đối tượng hộp thoại hiện tại. Mặc định là null sẽ xuất hiện hộp thoại giữa màn hình.
messageStringExpression Là giá trị sẽ xuất hiện trong hộp thoại.
boxTitleString Tiêu đề của hộp thoại
messageType Sẽ nhận một trong các giá trị JOptionPane.ERROR_MESSAGE, JOptionPane.INFORMATION_MESSAGE,

JOptionPane.PLAIN_MESSAGE,

JOptionPane.QUESTION_MESSAGE,

JOptionPane.WARNING_MESSAGE. Mỗi một giá trị tương ứng với một kiểu icon tương ứng.

Ví dụ 1:


JOptionPane.showMessageDialog(null, "Hello World!", "Greetings",

           JOptionPane.INFORMATION_MESSAGE);

Kết quả

Ví dụ 2:


JOptionPane.showMessageDialog(null, "Hello World!", "Greetings",

           JOptionPane.ERROR_MESSAGE);

Kết quả:

Ví dụ 3:


JOptionPane.showMessageDialog(null, "Hello World!", "Greetings",
             JOptionPane.PLAIN_MESSAGE);

Kết quả

Ví dụ 4:


JOptionPane.showMessageDialog(null, "Hello World!", "Greetings",

             JOptionPane.QUESTION_MESSAGE);

Kết quả

Ví dụ 5:


JOptionPane.showMessageDialog(null, "Hello World!", "Greetings",

            JOptionPane.WARNING_MESSAGE);

Kết quả

Làm việc với tập tin (file)

Chúng ta đã học cách nhập/xuất dữ liệu thông qua các thiết bị chuẩn như bàn phím/màn hình và hộp thoại. Nhưng những cách nhập/xuất này chỉ phù hợp cho số lượng dữ liệu nhỏ, và đối với các số liệu lớn, chúng ta sử dụng tập tin với hai lớp FileReaderPrintWriter trong gói java.io.

Đọc dữ liệu từ tập tin

Để đọc dữ liệu từ tập tin, chúng ta dùng lớp FileReader. Giả sử chúng ta có tập tin Data.txt được lưu trữ tại D:\LearnJava. Để có thể đọc dữ liệu từ tập tin Data.txt, chúng ta thực hiện các bước sau:

  • Import io.*java.util.*
  • Tạo một đối tượng Scanner (giả sử tên là inFile) và khởi tạo nó đến tập tin txt bằng đối tượng FileReader như sau:

Scanner inFile = new Scanner(new FileReader("D:\\LearnJava\\Data.txt"));

Lưu ý: có thể phát sinh lỗi như sau:

Đây là thông báo yêu cầu chúng ta xử lý trong trường hợp tập tin không được tìm thấy. Chỉ cần kích chuột vào liên kết Add throws declaration và nếu chúng ta viết đoạn mã trên trong phương thức main thì lúc này phương thức main sẽ xuất hiện thêm lệnh throws như sau:


public static void main(String[] args) throws FileNotFoundException {

   // TODO Auto-generated method stub

   Scanner inFile = new Scanner(new FileReader("D:\\LearnJava\\Data.txt"));

}

Đọc dữ liệu từ tập tin txt qua đối tượng inFile. Lưu ý rằng, dữ liệu trong tập tin được phân biệt bởi khoảng trắng, ví dụ nội dung trong tập tin Data.txt là:

Hello Minh thì HelloMinh phải được lưu trữ trong những biến khác nhau như đoạn mã sau:


String greeting = inFile.next();

String name = inFile.next();

System.out.print(greeting + " "+name);

Đóng đối tượng đọc tập tin bằng phương thức close():


inFile.close();

Đoạn mã hoàn chỉnh:


import java.io.*;

import java.util.*;

public class MyMainClass {

  public static void main(String[] args) throws FileNotFoundException {

     // TODO Auto-generated method stub

     Scanner inFile = new Scanner(new FileReader("D:\\LearnJava\\Data.txt"));

     String greeting = inFile.next();

     String name = inFile.next();

     System.out.print(greeting + " "+name);// Hello Minh

     inFile.close();

  }

}

Ghi dữ liệu đến tập tin

Để có thể lưu trữ dữ liệu đến tập tin, chúng ta dùng lớp PrintWriter theo hai bước sau:

  • Tạo một đối tượng PrintWriter (ví dụ như outFile) và kết nối đến tập tin cần lưu trữ dữ liệu (ví dụ txt) như đoạn mã sau:

PrintWriter outFile = new PrintWriter("D:\\\\LearnJava\\\\Data.txt");

  • Sử dụng các phương thức như print, println, hay printf (giống out) của đối tượng PrintWriter để ghi dữ liệu đến tập tin như đoạn mã sau:

outFile.println("Welcome to Nha Trang!");

  • Đóng đối tượng ghi tập tin bằng phương thức close()

outFile.close();

Ví dụ sau minh họa một chương trình lấy hai số thực được lưu trữ trong tập tin Input.txt, tính tổng của chúng và lưu trữ kết quả trong tập tin Output.txt. Hai tập tin Input.txtOutput.txt được chứa trong thư mục D:\LearnJava.

  • Bước 1: vào thư mục D:\LearnJava và tạo hai tập tin txtOutput.txt. Gõ hai số thực bất kỳ vào tập tin Input.txt ví dụ 3.5 6.0 (chú ý có khoảng trắng giữa 2 số), lưu và đóng tập tin Input.txt.
  • Bước 2: viết đoạn mã Java như sau:

// reading data from Input.txt

Scanner inFile = new Scanner(new FileReader("D:\\LearnJava\\Input.txt"));

double val1 = inFile.nextDouble();

double val2 = inFile.nextDouble();

double result = val1 + val2;

//storing result to Output.txt

PrintWriter outFile = new PrintWriter("D:\\LearnJava\\Output.txt");

outFile.printf(val1 +" + "+ val2 + " = "+ result);

inFile.close();

outFile.close();

Có thể xem chương trình hoàn chỉnh tại GitHub.

Ngôn ngữ Java >