Bài giảng Lập trình Java - Chương 5: Input - Output trong Java
Mục tiêu
1. Hiểu khái niệm về dòng.
2. Biết các lớp ñảm nhiệm việc việc xuất nhập dữ
liệu trong Java.
3. Biết cách sử dụng các lớp io ñể xuất nhập dữ
liệu với màn hình và bàn phím.
4. Biết cách xuất nhập dữ liệu với tập tin văn bản,
tập tin chứa các dữ liệu thuộc kiểu cơ bản, tập
tin chứa dữ liệu là các ñối tượng.
5. Biết các interface và các lớp quản lý việc in ấn.
ảm nhiệm công việc nhập xuất có lọc dữ liệu (nhập xuất có ñiều kiện) • Là các lớp cha của các lớp dòng nhập xuất có bộ lọc khác 22 10.3.7- BufferedInputStream và BufferedOutputStream • Buffer: Bộ nhớ ñệm của qúa trình ñọc ghi dữ liệu với các dòng nhập xuất nhằm tăng hiệu qủa quá trình ñọc ghi dữ liệu (ñọc ghi theo khối lớn thay vì theo từng byte). Chúng ta có thể lấy dữ liệu từ buffer thay vì từ nguồn dữ liệu. • Đây là hai lớp quản lý nhập xuất dữ liệu có ñệm . • Bàn phím là 1 thiết bị nhập có ñệm. • Màn hình là 1 thiết bị xuất có ñệm. • Lớp tự hiện thực dòng nhập xuất chuẩn (bàn phím, màn hình) thường là lớp con của 2 lớp này. Lớp BufferInputStream 23 Lớp BufferOutputStream 10.3.8- DataInput interface và DataOutput interface DataInputStream và DataOutputStream • DataInput interface ñược dùng ñể ñọc các byte nhị phân từ 1 dòng byte vật lý (InputStream) và xây dựng lại các byte này thành các dữ liệu có kiểu cơ bản (primitive data types). Inteface này cũng chuyển ñổi chuỗi dạng UTF-8 có sửa ñổi thành dữ liệu dạng String . • DataOutput interface lại làm ngược lại những gì mà DataInput interface ñã làm. • Hai interface này ñược 2 lớp DataInputStream và DataOutputStream hiện thực. 24 DataInput interface DataOutput interface 25 Minh họa về sử dụng DataInputStream và DataOutputStream 10.3.9- Interface ObjectInput và ObjectOutput • Là 2 interface con của DataInput và DataOutput interfaces cho việc nhập xuất ñối tượng. • Hai lớp ObjectInputStream và ObjectOutputStream hiện thực 2 interface này. 26 public interface ObjectInput extends DataInput public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants Các hành vi ñọc dữ liệu thuộc kiểu cơ bản Đọc object từ stream public interface ObjectOutput extends DataInput public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants Các hành vi ghi dữ liệu thuộc kiểu cơ bản Ghi object vào stream 27 Để ñọc ghi object với stream • class của object phải implements interface Serializable ñể thống nhất cách ñọc ghi object của hai tác vụ readObject và writeObject. • Việc ñồng bộ cơ chế ñọc ghi ñối tượng thông qua hành vi toString(), tuần tự hóa dữ liệu của ñối tượng. Minh họa ObjectInputStream và ObjectOutputStream implements Serializable ñể ñồng bộ 2 quá trình ñọc ghi ñối tượng với stream Các tác vụ chỉnh dạng giúp xuất dữ liệu cho ñẹp Lớp mô tả cho 1 cuốn sách 28 Minh họa ObjectInputStream và ObjectOutputStream Lớp mô tả cho 1 tập các cuốn sách Kiểm tra sự tồn tại của 1 sách với mã số ñã biết Thêm 1 cuốn sách Thêm các cuốn sách từ 1 file Ghi tập các cuốn sách lên 1 file Xuất tập các cuốn sách ra màn hình Minh họa ObjectInputStream và ObjectOutputStream Lớp cho chương trình chính Kết qủa Nếu bỏ implements Serializable trong class SACH 29 10.3.10- Các dòng trừu tượng cho ký tự Reader , Writer • Đơn vị xử lý trong dòng là ký tự 2 byte. public abstract class Reader extends Object implements Readable, Closeable public abstract class Writer extends Object implements Appendable, Closeable, Flushable • Các lớp con của Writer chỉ cần override write(char[], int, int), flush(), và close() • Các lớp con của Reader chỉ cần override read(char[], int, int) và close(). • Có thể overide thêm các methods khác hoặc thêm methods nếu muốn. Các lớp dẫn xuất 30 Reader class skip(long n) - bỏ qua n ký tựlong reset() : Reset dòng về vị trí ñánh dấu cuối cùng nếu cóvoid ready() - Kiểm tra dòng có sẵn sàng ñể ñọc hay ñang bị khóaboolean read(CharBuffer target) Đọc các ký tự ñưa vào buffer, trả về số ký tự ñã ñọc ñược (-1 khi hết dòng) int read(char[] cbuf, int off, int len) Đọc len ký tự lưu vào mảng cbuf từ vị trí off .Trả về số ký tự ñã ñọc ñược (-1 khi hết dòng) abstract int read(char[] cbuf) : Đọc 1 mảng ký tự, trả về ñọc ñược (-1 khi khi hết dòng)int read() - Đọc 1 ký tự từ dòngint markSupported() : Kiểm tra dòng có hỗ trợ tác vụ ñánh dấu?boolean mark(int readAheadLimit) – Đánh dấu vị trí hiện hànhvoid close() – Đóng dòngabstract void Reader(Object lock) : Tạo dòng nhập với ñối tượng ñồng bộ ñã cóprotected Reader() , contructor tạo 1 dòng nhập ký tự có cơ chế ñồng bộprotected lock : Field ñược dùng ñể ñồng bộ các tác vụ của dòngprotected Object class Reader Summary - throws IOException class Writer write(char[] cbuf)void flush() Flush the stream.abstract void close() Close the stream, flushing it first.abstract void append(CharSequence csq, int start, int end) Appends a subsequence of the specified character sequence to this writer. Writer append(CharSequence csq) Appends the specified character sequence to this writer. Writer append(char c) Appends the specified character to this writer.Writer Writer(Object lock) Create a new character-stream writer whose critical sections will synchronize on the given object. protected Writer() Create a new character-stream writer whose critical sections will synchronize on the writer itself. protected lock (filed) The object used to synchronize operations on this stream.protected Object Class Writer Summary 31 10.3.11- Lớp BufferedReader và BufferedWriter • Dòng nhập/xuất ký tự có sử dụng bộ ñệm • Giúp nhập xuất dữ liệu theo dạng ký tự, dòng (line) ký tự. Lớp BufferedReader 32 Lớp BufferedWriter 10.3.12- Lớp InputStreamReader Lớp OutputStreamReader • Các lớp cầu nối giữa dòng vật lý và dòng ký tự. • InputStreamReader sẽ ñọc các byte vật lý rồi chuyển thành các ký tự. • OutputStreamWriter sẽ ghi các ký tự thành byte vật lý • Thường ñược dùng cho bàn phím và màn hình vì ñây là các thiết bị ký tự, khi xuất nhập 1 số (byte vật lý) CẦN CÓ SỰ CHUYỂN ĐỔI BYTE VẬT LÝ KÝ TỰ 33 Sử dụng kết hợp ñể có hiệu qủa Khai báo dòng nhập là bàn phím: Gói InputStreamReader trong BufferedReader BufferedReader in = new BufferedReader(new InputStream(System.in)); Khai báo dòng xuất là màn hình: Gói OutputStreamWriter trong BufferedWriter Writer out = new BufferedWriter(new OutputStreamWriter(System.out)); Lớp InputStreamReader 34 Lớp OutputStreamWriter Minh họa tự xây dựng một lớp nhập dữ liệu từ bàn phím (xuất dữ liiệu ñã có System.out.print(...) import java.io.*; class MyIO { static int ReadInt () throws java.io.IOException { int n=0; BufferedReader Obj = new BufferedReader(new InputStreamReader(System.in)); try { n= Integer.parseInt(Obj.readLine()); } catch (Exception e) { System.err.println(e.toString()); System.exit(0); } return n; } 35 static char ReadChar () throws java.io.IOException { char x=0; Reader Obj = new InputStreamReader(System.in); try { x= (char) Obj.read(); } catch (Exception e) { System.err.println(e.toString()); System.exit(0); } return x; } static int ReadCharCode () throws java.io.IOException { return System.in.read(); } static String ReadString () throws java.io.IOException { String s; BufferedReader Obj = new BufferedReader(new InputStreamReader(System.in)); s=Obj.readLine(); while (s.length()==0) s=Obj.readLine(); return s; } } 10.3.13- Lớp FileReader và FileWriter • Là các lớp con của lớp InputStreamReader và OutputStreamWriter tương ứng nên thừa kế cac1 khả năng về chuyển ñổi ký tự byte • Giúp truy cập file 36 Lớp FileReader Lớp FileWriter 37 10.3.14- Lớp CharArrayReader và Lớp CharArrayWriter • Hiện thực 1 mảng ký tự (character buffer) cho việc nhập xuất. public class CharArrayReader extends Reader public class CharArrayWriter extends Writer public class CharArrayReader extends Reader 38 public class CharArrayWriter extends Reader 10.3.15- Lớp StringReader và StringWriter • Dòng nhập xuất thông qua String 39 public class StringReader extends Reader public class StringWriter extends Writer 40 10.3.16- public class PrintWriter extends Writer • Làm nhiệm vụ xuất dữ liệu cơ bản, biểu diễn của ñối tượng có ñịnh dạng ra một dòng xuất ký tự. Lớp PrintWriter void print (x) ; void println(x) với x là dữ liệu cơ bản hoặc ñối tượng, String 41 10.4- Gói java.lang và lớp System • Gói java.lang là gói cơ bản của ngôn ngữ Java (language). • Gói này chứa khai báo các lớp wrapper như Boolean, Char, Integer,... • Có lớp System mô tả cho hệ thống subclasses: Gói java.lang 42 public final class System extends Object • Data static PrintStream err :mô tả thiết bị xuất lỗi chuẩn (màn hình) static PrintStream out :mô tả thiết bị xuất chuẩn (màn hình) static PrintStream in :mô tả thiết bị nhập chuẩn (bàn phím) • Methods Các hành vi của lớp System là các hành vi mức hệ thống như truy xuất thời gian, truy xuất các thiết lập hệ thống (trong Config.sys), thoát JVM, nạp 1 lớp trong 1 file, nạp 1 thư viện, kết thúc 1 object, thiết lập thiết bị nhập xuất hệ thống khác với các thiết bị xuất nhập chuẩn, lấy/thiết lập cơ chế bảo mật… public final class System extends Object .... Các method thường dùng: static long currentTimeMillis() lấy giờ hệ thống theo millisec so với 12 giờ ñêm ngày 1/1/1970 static long nanoTime() lấy giờ hệ thống theo nanosec (chỉ có từ Java 1.5.0) static void exit(int status) kết thúc JVM static void gc(void) : gọi trình gom rác (garbage collector) static Properties getProperties(void) lấy thiết lập hệ thống (trong Config.sys) 43 Thí dụ về truy xuất thông tin hệ thống Gói java.util chứa lớp Date 10.5- Thí dụ xuất nhập dữ liệu với tập tin văn bản • Tự tham khảo trong tài liệu class WriteFile , class IntMatrix 44 10.6 – Tóm tắt • Gói java.io chứa các lớp cho việc xuất nhập dữ liệu. • Các dòng xuất nhập ñược chia thành 2 loại: dòng văn bản, dòng byte vật lý. • Dòng văn bản xử lý dữ liệu theo từng ký tự 2 byte • Dòng byte vật lý xử lý dữ liệu theo từng byte. • Tác vụ nhập xuất có thể gây lỗi runtime nên cần throws IOException. • Khi lưu trữ dữ liệu vào dòng, cần chọn 1 ñịnh dạng lưu trữ trước ñể khi phải ñọc ra sẽ ñọc ñược ñúng dữ liệu.
File đính kèm:
- Bài giảng Lập trình Java - Chương 5_Input - Output trong Java.pdf