Bài giảng Lập trình Java - Chương 11: Input - Output trong Java
10.1- Giới thiệu.
10.2- Dòng dữ liệu.
10.3- Gói java.io và các dòng nhập xuất
10.4- Lớp System và thiết bị xuất nhập chuẩn
10.5 – Thí dụ xuất nhập dữ liệu với tập tin văn bản
10.6- Tóm tắt
các phương thức của lớp cha InputStream (read(...),...), có 2 hành vi được thêm vào: protected void finalize() throws IOException: Đóng dòng (file) FileDescriptor getFD() : Lấy file descriptor kết nối với file thực mà đối tượng FileInputStream này sử dụng. Lớp FileOutputStream Constructors FileOutputStream (File f) // f đã có FileOutputStream (File f, boolean append) // f đã có FileOutputStream (FileDescriptor fdesc) // fdesc đã có FileOutputStream (String FileName) FileOutputStream (String FileName, boolean append) Methods Ngoài những methods được override từ các phương thức của lớp cha OutputStream, có 2 hành vi được thêm vào: protected void finalize() throws IOException : Đóng dòng (file) FileDescriptor getFD() : Lấy file descriptor kết nối với file thực mà đối tượng FileOutputStream này sử dụng. Minh họa 10.3.5- Lớp RandomAccessFile Cung cấp khả năng di chuyển tới lui trong file vì xem đơn vị lưu trữ trong file là byte. Do vậy có thể đọc/ghi file tại những vị trí đã được chỉ định (nên gọi là random access). Lớp RandomAccessFile cung cấp cả 2 tác vụ đọc/ghi dữ liệu. Do vậy lớp này có thể dùng để đọc/ghi các dữ liệu thuộc kiểu cơ bản. Có các hành vi readXXX(), writeXXX() để đọc ghi các dữ liệu thuộc kiểu cơ bản. Lớp RandomAccessFile... Constructors RandomAccessFile(File f, String mode) RandomAccessFile(String Filename, String mode) Lớp RandomAccessFile... Lớp RandomAccessFile... Minh họa lớp RandomAccessFile Minh họa lớp RandomAccessFile Chú ý: (1) Với file đối tượng RandomAccessFile, chúng ta có thể di chuyển tự do trong file. Do vậy để thao tác đọc ghi đúng đữ liệu , chúng ta phải biết rõ trật tự ghi dữ liệu lên file để khi đọc dữ liệu từ file ra biến đúng cách. Trong thí dụ trên: Qúa trình ghi: Đầu tiên : Ghi 1 trị boolean (vị trí 0) Sau đó: Ghi 1 trị int ( vị trí 1) Sau đó: Ghi 1 ký tự. Sau đó: Ghi 1 trị double Sau đó : ghi chuỗi S=”Tran Trung Truc” , 15 ký tự Sau đó: Ghi 1 trị long (90) Nhờ vậy, qúa trình đọc file ra biến biết chỗ để nhẩy đến (xem seek(1), seek(0) trong code). (2) Khi xem file với Notepad của Windows, có những nội dung số ta không đọc được vì Nodepad xem các byte lưu trữ là mã ASCII của ký tự. Chỉ khi đọc bằng code Java rồi xuất ta mới biết rõ nội dung (xem lại kết quả chương trình). 10.3.6- FilterInputStream và FilterOutputStream Là các lớp con của các lớp InputStream và OutputStream tương ứng đả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 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 Lớp BufferOutputStream 10.3.8- DataInput interface và DataOutput interfaceDataInputStream 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. DataInput interface DataOutput interface 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. public interface ObjectInput extends DataInputpublic 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 DataInputpublic 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 Để đọ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 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 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 Reader class class Writer 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 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Ự 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 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; } 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 Lớp FileReader Lớp FileWriter 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 public class CharArrayWriter extends Reader 10.3.15- Lớp StringReader và StringWriter Dòng nhập xuất thông qua String public class StringReader extends Reader public class StringWriter extends Writer 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 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 Gói java.lang 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) 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 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 11_Input - Output trong Java.ppt