Lập trình Java cơ bản - Chương 9: Luồng I/O
Kết thúc chương, bạn có có thể :
Đề cập đến các khái niệm về luồng
Mô tả các lớp InputStream và OutputStream
Mô tả I/O mảng Byte
Thực hiện các tác vụ đệm I/O và lọc
Dùng lớp RandomAccesFile.
Mô tả các tác vụ chuỗi I/O và ký tự
Dùng lớp PrinterWriter
4 Các tác vụ nhập và xuất mảng các ký tự Chương trình 9.5 Mô tả tiến trình nhập/xuất chuỗi. Chương trình 9.5 import java.lang.System; import java.io.StringReader; import java.io.StringWriter; import java.io.IOException; import java.io. * ; public class strioexam { public static void main(String args[ ]) throws IOException { StringWriter ost = new StringWriter( ); .String s = "Welcome to String Input Output Program"; for(int i= 0; i <s.length( ); + +i) ost.write(s.charAt(i)) ; System.out.println("Output Stream is: " + ost); StringReader inst; inst = new StringReader(ost.toString( )); int a= 0; StringBuffer sb1 = new StringBuffer(" "); while((a = inst.read( )) ! = -1) sb1.append((char) a); s = sb1.toString( ); , System.out.println("No of characters read: " +s.length( )); System.out.println("They are: " + s); } } Hình 9.5 Hiện kết xuất chương trình: Hình 9.5 Nhập và xuất sâu chuỗi 9.3.9 Lớp PrinterWriter Lớp ‘PrintStream’ thực hiện việc kết xuất dữ liệu. Lớp này có các phương thức bổ sung, trợ giúp cho việc in ấn dữ liệu cơ bản. Lớp PrinterWriter’ là một thay thể của lớp PrinterStream. Nó thực tế cải thiện lớp PrinterStream bằng cách dùng dấu tách dòng phụ thuộc nền tảng để in các dòng thay vì ký tự ‘\n’. Lớp này cũng cấp hỗ trợ các ký tự Unicode so với PrinterStream. Phương thức ‘checkError( )’ được sử dụng kiểm tra kết xuất được xả sạch và và được kiểm ra các lỗi. Phương thức setError( ) được sử dụng để thiết lập lỗi điều kiện. Lớp PrintWriter cung cấp việc hỗ trợ in ấn các kiểu dữ liệu nguyên thuỷ, các mảng ký tự, các sâu chuỗi và các đối tượng. 9.3.10 Giao diện DataInput Giao diện DataInput được sử dụng để đọc các byte từ luồng nhị phân và xây dựng lại các kiểu dữ liệu dạng nguyên thuỷ trong Java. DataInput cũng cho phép chúng ta chuyển đổi dữ liệu từ định dạng sửa đổi UTF-8 tới dạng sâu chuỗi. Chuẩn UTF cho định dạng chuyển đổi Unicode. Nó là kiểu định dạng đặt biệt giải mã các giá trị Unicode 16 bit . UTF lạc quan ở mức thấp giả lập trong hầu hết các trường hợp, mức cao 8 bít Unicode sẽ là 0. Giao diện DataInput được định nghĩa là số các phương thức, các phương thức bao gồm việc đọc các kiểu dữ liệu nguyên thuỷ trong java. Bảng 9.3 tóm lượt vài phương thức. Tất cả các phương thức được kính hoạt IOException trong trường hợp lỗi: Tên phương thức Mô tả boolean readBoolean( ) Đọc một byte nhập, và trả về đúng nếu byte đó không phải là 0, và sai nếu byte đó là 0. byte readByte( ) Đọc một byte char readChar( ) Đọc và trả về một giá trị ký tự short redShort( ) Đọc 2 byte và trả về giá trị short long readLong( ) Đọc 8 byte và trả về giá trị long. float readFloat( ) đọc 4 byte và trả về giá trị float int readInt( ) Đọc 4 byte và trả về giá trị int double readDouble( ) Đọc 8 byte và trả về giá trị double String readUTF( ) Đọc một sâu chuỗi String readLine( ) Đọc một dòng văn bản Bảng 9.3 Các phương thức của giao diện DataInput 9.3.11 Giao diện DataOutput Giao diện DataOutput được sử dụng để xây dựng lại các kiểu dữ liệu nguyên thuỷ trong java vào trong dãy các byte. nó ghi các byte này lên trên luồng nhị phân. Giao diện DataOutput cũng cho phép chúng ta chuyển đổi một sâu chuỗi vào trong java được sửa đổi theo định dạng UTF-8 và ghi nó vào luồng. Giao diện DataOutput định nghĩa số phương thức được tóm tắt trong bảng 9.4. Tất cả các phương thức sẽ kích hoạt IOException trong trường hợp lỗi. Tên phương thức Mô tả void writeBoolean(Boolean b) Ghi một giá trị Boolean vào luồng void writeByte(int value) Ghi giá trị 8 bit thấp void writeChar(int value) Ghi 2 byte giá trị kiểu ký tự vào luồng void writeShort(int value) Ghi 2 byte, biểu diễn lại giá trị dạng short void writeLong(long value) Ghi 8 byte, biểu diễn lại giá trị dạng long void writeFloat(float value) Ghi 4 byte, biểu diễn lại giá trị dạng float void writeInt(int value) ghi 4 byte void writeDouble(double value) Ghi 8 byte, biểu diễn lại giá trị dạng double void writeUTF(String value) Ghi một sâu dạng UTF tới luồng. Bảng 9.4 Các phương thức của giao diện DataOutput 9.3.12 Lớp RandomAccessFile Lớp RandomAccessFile cung cấp khả năng thực hiện I/O theo một vị trí cụ thể bên trong một tập tin. Trong lớp này, dữ liệu có thể đọc hoặc ghi ở vị trí ngẫu nhiên bên trong một tập tin thay vì một kho lưu trữ thông tin liên tục. hơn thế nữa lớp này có tên RandomAccess. Phương thưc ‘seek( )’ hỗ trợ truy cập ngẫu nhiên. Kết quả là, biến trỏ tương ứng với tạp tin hiện hành có thể ấn định theo vị trí bất kỳ trong tập tin. Lớp RandomAccessFile thực hiện cả hai việc nhập và xuất. Do vây, có thể thực hiện I/O bằng các kiểu dữ liệu nguyên thuỷ. Lớp này cũng hỗ trợ cho phép đọc hoặc ghi tập tin cơ bản, điều này cho phép đọc tập tin theo chế độ chỉ đọc hoặc đọc-ghi. tham số ‘r’ hoặc ‘rw’ được gán cho lớp RandomAccessFile chỉ định truy cập ‘chỉ đọc’ và ‘đọc-ghi’. Lớp này giới thiệu vài phương thức mới khác với phương pháp đã thừa kế từ các lớp DataInput và DataOutput. Các phương thức bao gồm: seek( ) Thiết lập con trỏ tập tin tới vị trí cụ thể bên trong tập tin. getFilePointer( ) Trả về vị trí hiện hành của con trỏ tập tin. length( ) Trả về chiều dài của tập tin tính theo byte. Chương trình dưới đây minh hoạ cách dùng lớp RandomAccessFile. Nó ghi một giá trị boolean, một int, một char, một double tới một file có tên ‘abc.txt’. Nó sử dụng phương pháp seek( ) để tìm vị trí định vị 1 bên trong tập tin. Sau đó nó đọc giá trị số nguyên, ký tự và double từ tập tin và hiển thị chúng ra màn hình. Chương trình 9.6 import java.lang.System; import java.io.RandomAccessFile; import java.io.IOException; public class mdexam { public static void main (String args[ ]) throws IOException { RandomAccessFile rf; rf= new RandomAccessFile("abc.txt", "rw"); rf. writeBoolean(true); rf. writelnt( 67868) ; rf.writeChars("J"); rf. writeDouble(678.68); / / making use of seek( ) method to move to a specific file location rf.seek(l); System.out.println(rf.readlnt( )); System.out.println(rf.readChar( )); System.out.println(rf.readDouble( )); rf.seek(0); System.out.println(rf.readBoolean( )); rf.close( ); } } Hình 9.5 Hiện kết xuất chương trình: Hình 9.6: Lớp RandomAccessFile Gói java.awt.print Đây là gói mới mà java JDK 1.2 cung cấp. Nó thay thế khả năng in của JDK 1.1. Nó bao gồm dãy các giao diện: Pageable Printable PrinterGraphics Giao diện ‘Pageable’ định nghĩa các phương thức được sử dụng cho đối tượng mô tả lại các trang sẽ được in. Nó cũng chỉ định số lượng trang sẽ được in cũng như sẽ được in trang hiện hành hay một miền trang. Giao diện ‘Printable’ chỉ định phương thức print( )được dùng để in một trạng trên một đối tượng Graphics. Giao diện ‘PrinterGraphics‘ cung cấp khả năng truy cập đối tượng ‘PrinterJob’. Nó cung cấp các lớp sau đây: Paper Book PageFormat Printerjob Lớp ‘Page’ định nghĩa các đặc tính vật lý của giấy in. Ngoài ra nó cũng cung cấp khổ giấy và vùng vẽ. Lớp ‘Book’ là một lớp con của đối tượng duy trì một danh sách các trang in. Lớp này cũng cung cấp các phương thức để bổ sung và quản lý các trang cũng như thực thi giao diện Pageable. Lớp ‘PageFormat’ định nghĩa lề của trang như các lề ‘Top’, ‘Bottom’,’Left’ và ‘Right’. Nó cũng chỉ định kích cỡ và hướng in như ‘Portait’ (khổ dọc) hoặc ‘Landscape’ (khổ ngang). Lớp ‘Printerjob’ là một lớp con của đối lượng khởi tạo, quản lý, và điều khiển yêu cầu máy in. Lớp này cũng chỉ định các tính chất in. Dưới đây là ngoại lệ và lỗi mà gói java.awt.print kích hoạt: PrinterException PrinterIOException PrinterAbortException ‘PrinterException‘ mở rộng lớp java.lang.Exception nhằm cung cấp một lớp cơ sở để in các ngoại lệ liên quan. ‘PrinterIOException’ mở rộng lớp ‘PrinterException’ nêu rõ một lỗi trong i/o. ‘PrinterAbortException’ là lớp con của lớp PrinterException nêu rõ khối in đã được bỏ ngang. Tóm tắt bài học Một luồng là một lộ trình qua đó dữ liệu di chuyển trong một chương trình java. Khi một luồng dữ liệu được gửi hoặc nhận.Chung ta xem nó như đang ghi và đọc một luồng theo thứ tự nêu trên. Luồng nhập/xuất bao gồm các lớp sau đây: Lớp System.out Lớp System.in Lớp System.err Lớp InputStream là một lớp trừu tượng định nghĩa cách nhận dữ liệu. Lớp OutputStream cũng là lớp trừu tượng. Nó định nghĩa ghi ra các luồng được kết xuất như thế nào. Lớp ByteArrayInputStream tạo ra một luồng nhập từ vùng đệm bộ nhớ trong khi ByteArrayOutputStream tạo một luồng xuất trên một mãng byte. Java hổ trợ tác vụ nhập/xuất tập tin với sự trợ giúp của các File, FileDescriptor, FileInputStream và FileOutputStream. Các lớp Reader và Writer là lớp trừu tượng hỗ trợ đọc và ghi các luồng ký tự Unicode. CharArrayReader, CharArrayWriter khác với ByteArrayInputStream, ByteArrayOutputStream hỗ trợ định dạng nhập/xuất 8 bit, Trong khi ByteArrayInputStream, ByteArrayOutputStream hỗ trợ nhập/xuất 16bit. Lớp PrintStream thực thi một kết xuất. lớp này có phương thức bổ sung, giúp ta in các kiểu dữ liệu cơ bản. Lớp RandomAccessFile cung cấp khả năng thực hiện I/O tới vị trí cụ thể trong một tập tin. Kiểm tra mức độ tiến bộ ---------- là các dàn ống (pipelines) để gửi và nhận thông tin trong các chương trình java. ----------- là luồng lỗi chuẩn. Phương thức ------------- đọc các byte dữ liệu từ một luồng. Phương thức ------------- trả về giá trị boolean, nêu rõ luồng có hỗ trợ các khả năng mark và reset hay không. Phương thức ------------ xả sạch luồng. Nhập/xuất mảng byte sử dụng các lớp ------------ và --------------------- Lớp --------------- được sử dụng truy cập các đối tượng thư mục và tập tin. --------------là một khi chưa để lưu giữ dữ liệu. Bài tập Viết chương trình nhận một dòng văn bản từ người dùng và hiển thị đoạn văn bản đó lên màn hình. Viết chương trình sao chép nội dụng một tập tin tới tập tin khác. Viết chương trình tạo ra một tập tin truy cập ngẫu nhiên. kết xuất hiển thị phía dưới đây. Các bản ghi nên được lưu ở dạng tập tin ‘.dat’, vì vậy người dùng truy cập chúng nhanh hơn.
File đính kèm:
- Lập trình Java cơ bản - Chương 9_Luồng IO.doc