Phụ lục B: Đầu vào và đầu ra trong Java

Trở về Mục lục cuốn sách

B.1  Đối tượng System

Lớp System cung cấp các phương thức và đối tượng thu nhận đầu vào từ bàn phím, in dòng chữ lên màn hình, và thực hiện vào ra (input/output, I/O) đối với file. System.out là đối tượng để hiển thị lên màn hình. Khi bạn kích hoạt print và println, bạn đã kích hoạt chúng từ System.out.

Thậm chí bạn có thể dùng chính System.out để in ra System.out:

    System.out.println(System.out);

Kết quả là:

java.io.PrintStream@80cc0e5

Khi Java in ra một đối tượng, nó in ra kiểu của đối tượng này (PrintStream) cùng với gói mà kiểu đó được định nghĩa (java.io), và một số nhận diện duy nhất cho đối tượng này. Trên máy tính tôi dùng, số nhận diện nói trên là 80cc0e5, nhưng vẫn với mã lệnh này mà bạn chạy thì có thể sẽ nhận được kết quả khác.

Cũng có một đối tượng có tên System.in cho phép ta nhận đầu vào từ bàn phím. Tuy vậy không may là đối tượng trên không giúp cho việc lấy dữ liệu bàn phím dễ dàng cho lắm.

B.2  Đầu vào từ bàn phím

Trước hết, bạn phải dùng System.in để tạo nên một InputStreamReader mới.

    InputStreamReader in = new InputStreamReader(System.in);

Sau đó bạn dùng in để tạo nên một BufferedReader mới:

    BufferedReader keyboard = new BufferedReader(in);

Sau cùng, bạn có thể kích hoạt readLine lên keyboard, để lấy kết quả đầu vào từ bàn phím rồi chuyển nó thành một String.

    String s = keyboard.readLine(); 
    System.out.println(s);

Chỉ có một vấn đề. Có thể xuất hiện trục trặc khi bạn kích hoạt readLine, và chúng có thể phát biệt lệ IOException. Một phương thức phát ra biệt lệ phải bao gồm biệt lệ này trong phần nguyên mẫu của phương thức đó, như sau:

  public static void main(String[] args) throws IOException { 
    // phần thân của main 
  }

B.3  Đầu vào từ file

Sau đây là một chương trình đọc vào các dòng trong một file rồi in những dòng đó ra:

import java.io.*; 
public class Words { 
  public static void main(String[] args) throws FileNotFoundException, IOException { 
    processFile("words.txt"); 
  } 

  public static void processFile(String filename) throws FileNotFoundException, IOException { 
    FileReader fileReader = new FileReader(filename); 
    BufferedReader in = new BufferedReader(fileReader); 
    while (true) { 
      String s = in.readLine(); 
      if (s == null) 
        break; 
      System.out.println(s); 
    } 
  } 
}

Dòng đầu tiên làm nhiệm vụ nhập java.io, gói chương trình có chứa FileReaderBufferedReader, và phần còn lại trong thư mục thừa kế lớp để thực hiện những công việc giản đơn thông thường. Dấu * có nghĩa là nó sẽ nhập vào toàn bộ các lớp trong gói chương trình này.

Sau đây cũng là chương trình đó được viết lại bằng ngôn ngữ Python:

for word in open('words.txt'):
    print word

Tôi không đùa. Từng đó đã đủ một chương trình, với tính năng tương tự.

B.4  Bắt biệt lệ

Ở ví dụ trước, processFile có thể phát những biệt lệ FileNotFoundException và IOException. Và vì main gọi đến processFile, nó phải khai báo cùng những biệt lệ đó. Trong một chương trình lớn hơn, main có thể khai báo từng biệt lệ có mặt.

Một cách làm khác là bắt biệt lệ này bằng câu lệnh try. Sau đây là một ví dụ:

  public static void main(String[] args) { 
    try { 
      processFile("words.txt"); 
    } 
    catch (Exception ex) { 
      System.out.println("Cách này không có tác dụng. Sau đây là lý do:"); 
      ex.printStackTrace(); 
    } 
  }

Cấu trúc này tương tự như một lệnh if. Nếu “nhánh” thứ nhất chạy mà không gây ra một biệt lệ nào, thì nhánh thứ hai sẽ được bỏ qua.

Nếu như nhánh thứ nhất gây nên một biệt lệ, thì luồng thực thi sẽ nhảy đến nhánh thứ hai, vốn để xử lý điều kiện biệt lệ (bằng cách nói “sai rồi” theo một cách lịch thiệp). Trong trường hợp này nó in ra một thông báo lỗi cùng với kết quả lần dấu ngăn xếp.

Bạn có thể tải đoạn mã lệnh này về từ http://thinkapjava.com/code/Words.java và danh sách từ vựng ở http://thinkapjava.com/code/words.txt. Hãy đảm bảo chắc rằng hai file này đặt trong cùng thư mục. (Nếu bạn dùng môi trường phát triển tích hợp như NetBeans hoặc Eclipse, hãy đảm bảo rằng file words.txt nằm trong thư mục dự án hiện thời.)

Bây giờ hãy đi làm các Bài tập 9, 10, 11 của Chương 10 – Chuỗi kí tự.

1 bình luận

Filed under Think Java

1 responses to “Phụ lục B: Đầu vào và đầu ra trong Java

  1. Pingback: Think Java: Cách suy nghĩ như nhà khoa học máy tính | Blog của Chiến

Bình luận về bài viết này