Xuất nhập trong Java

pdf 60 trang vanle 2730
Bạn đang xem 20 trang mẫu của tài liệu "Xuất nhập trong Java", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfxuat_nhap_trong_java.pdf

Nội dung text: Xuất nhập trong Java

  1. 1 XUẤT NHẬP TRONGJAVA GV: Vũ Đình Hồng Khoa: CNTT – TỨD
  2. Mục tiêu 1. Khái niệm về dòng (luồng). 2. Biết các lớp đảm nhiệm việc việc nhập xuất dữ liệu trong Java (gói java.io) 3. Biết cách sử dụng các lớp thuộc gói java.io để nhập xuất dữ liệu với màn hình và bàn phím. 2
  3. Nội dung 1. Giới thiệu. 2. Dòng dữ liệu (luồng dữ liệu) 3. Gói java.io và các dòng nhập xuất 4. Tóm tắt 3
  4. Giới thiệu về GÓI trong Java  là nơi tổ chức các lớp và các giao diện. Các chương trình Java được tổ chức như những tập của các gói. Mỗi gói gồm có nhiều lớp, và/hoặc các giao diện được coi như là các thành viên của nó. Ưu điểm:  Cho phép tổ chức các lớp vào những đơn vị nhỏ hơn  Giúp tránh được tình trạng trùng lặp khi đặt tên.  Cho phép bảo vệ các lớp đối tượng  Tên gói (Package) có thể được dùng để nhận dạng chức năng của các lớp.  Các gói cũng có thể chứa các gói khác 4
  5. Các gói thông dụng  java.lang: Mặc định luôn có.  java.io: Bao gồm các lớp để trợ giúp cho các thao tác vào ra. ). Tương ứng với thư viện trong C/C++.  java.applet: Bao gồm các lớp để thực thi một applet trong trình duyệt.  java.awt: Các thành phần để xây dựng giao diện đồ họa(GUI). Nó tương ứng với thư viện trong C/C++.  java.util: Cung cấp nhiều lớp và nhiều giao diện tiện ích, như cấu trúc dữ liệu, lịch, ngày tháng,  java.net: Cung cấp các lớp và các giao diện cho việc lập trình mạng TCP/IP.  java.awt.event  java.rmi  java.security  java.sql 5
  6. Một số lớp trong JAVA.IO  InputStream  FileInputStream  OutputStream  FileOutputStream  ByteArrayInputStream  BufferedInputStream  ByteArrayOutputStream BufferedOutputStream  File  Reader  FileDescriptior  Writer  RandomAccessFile 6
  7. 1. Giới thiệu  Nhập dữ liệu là tác vụ đưa các dữ liệu cụ thể vào cho biến trong chương trình. Như vậy, phải có một nguồn chứa dữ liệu (bàn phím, tập tin, biến khác).  Xuất dữ liệu là tác vụ đưa trị cụ thể của biến trong chương trình ra một nơi chứa (màn hình hay file hay biến khác). Nhập/xuất dữ liệu là các phương tiện mà chương trình tương tác với user và thường không thể thiếu trong đa số các ứng dụng. 7
  8. 1. Giới thiệu  Hai cơ chế nhập xuất dữ liệu có tương tác với user: (1) Nhập xuất dữ liệu trong các ứng dụng console application (2) Nhập/xuất dữ liệu thông qua các phần tử trên GUI. Cách 1 thường dùng trong các ứng dụng chạy theo cơ chế tuần tự còn cách 2 được áp dụng trong các ứng dụng hướng cửa sổ. 8
  9. 1. Giới thiệu Keyboard  Buffered IO : Nhập xuất thông qua bộ đệm (một vùng vùng nhớ trung gian Buffer  Nhập có đệm (buffered Input) : Dữ liệu nhập được đệm lại không đi vào biến ngay lập tức. Thí dụ: Nhập 1 số Variable chỉ kết thúc khi gõ enter. Buffer  Xuất có đệm (buffered output): Dữ liệu xuất chỉ được xuất thực sự khi bộ đệm đầy hoặc khi gặp một tác vụ Screen buộc xuất tường minh (flush). 9
  10. 2. Dòng- stream  Dòng: Là một chuỗi các byte làm việc theo cơ chế tuần tự.  Khái niệm dòng xuất phát từ hệ điều hành UNIX.  Bàn phím là dòng nhập chuẩn, user gõ tuần tự các phím chuỗi các byte đi vào biến.  Màn hình là dòng xuất chuẩn, dữ liệu từ biến được chuyển thành các ký tự, ký số rồi các byte này lần lượt được xuất ra màn hình. 10
  11. 2. Dòng- stream  Chuỗi ký tự, mảng các byte chứa dữ liệu được chuyển vào cho biến cũng làm việc theo cơ chế chuyển từng byte Chuỗi, mảng dòng nhập. Ngược lại, có thể đưa dữ liệu từ biến ra chuỗi, mảng Chuỗi, mảng trở thành dòng xuất.  File cũng là nguồn cung cấp dữ liệu cho biến (file nhập), và cũng là nơi lưu trữ dữ liệu từ biến (file xuất). File làm việc theo cơ chế từng byte một File là dòng. 11
  12. 3. IO classes trong gói java.io Lớp trừu tượng trên cùng Lớp trừu tượng trên cùng java.io.InputStream java.io.OutputStream Dòng nhập byte vật lý Dòng xuất byte vật lý Xử lý từng byte một Xử lý từng byte một Biến / Đối tượng Dòng nhập ký tự Dòng xuất ký tự Xử lý theo đơn vị 2 byte Xử lý theo đơn vị 2 byte Lớp trừu tượng trên cùng Lớp trừu tượng trên cùng java.io.Reader java.io.Writer 12
  13. Phân cấp các lớp nhập theo byte vật lý 13
  14. Phân cấp các lớp xuất theo byte vật lý 14
  15. Phân cấp các lớp nhập theo ký tự 15
  16. Phân cấp các lớp xuất theo ký tự 16
  17. Phân cấp các lớp thao tác file với hệ điều hành Lớp File giúp truy xuất các thuộc tính của 1 file/thư mục. Lớp FileDescriptor: Giúp đồng bộ việc truy xuất file. Lớp RandomAccessFile: giúp đọc/ghi file với dữ liệu thuộc kiểu cơ bản 17
  18. 3.1- Các dòng trừu tượng byte-vật lý InputStream/OutputStream  Là hai lớp trừu tượng định nghĩa những thao tác truy xuất dữ liệu cơ bản (mức khái quát) theo từng byte vật lý mà không phân biệt nguồn dữ liệu là loại gì (file, chuỗi, ).  Các lớp dẫn xuất từ hai lớp này nhằm cụ thể hóa các dòng nhập xuất byte vật lý tùy từng tình huống. 18
  19. 3.1- Các dòng trừu tượng byte-vật lý InputStream/OutputStream 19
  20. Abstract class InputStream Method Summary construct InputStream() or int available( ) Trả về số bytes còn có thể được đọc (hay đã bị bỏ qua) void close( ) Đóng dòng, trả tài nguyên đã được liên kết với dòng void mark(int readlimit) Đánh dấu vị trí hiện hành, readlimit là số byte có thể được đọc trước khi vị trí đánh dấu không còn hợp lệ boolean markSupported( ) Kiểm tra dòng có cho phép đánh dấu và reset không? abstract read( ) Đọc 1byte kế tiếp từ dòng int int read(byte[ ] b) Đọc dòng ra mảng các byte int read(byte[ ] b, int off, int len) Đọc lên bytes từ dòng lưu vào mảng b từ phần tử thứ off void reset( ) Quay trở lại vị trí vừa được đánh dấu do method mark long skip(long n) Bỏ qua n bytes dữ liệu từ dòng 20
  21. Abstract OutputStream Method Summary constructor OutputStream() void close( ) đóng dòng xuất, trả tài nguyên void flush( ) Cưỡng bức ghi dữ liệu vào dòng xuất void write(byte[ ] b) Ghi mảng các byte lên dòng void write(byte[ ] b, int off, int len) Ghi len byte từ phần tử thứ off của mảng lên dòng xuất abstract write(int b) Ghi 1 byte vào dòng xuất void 21
  22. 3.2- Lớp ByteArrayInputStream Lớp ByteArrayOutputStream  Là hai lớp con tương ứng của InputStream và OutputStream.  Là hai dòng xuất nhập dạng mảng các bytes.  Dữ liệu của lớp ByteArrayInputStream: byte [ ] buf : mảng các byte dữ liệu, int count : số byte hiện có int mark: vị trí đánh dấu hiện hành, int pos: vị trí hiện hành.  Dữ liệu của lớp ByteArrayOutputStream: byte [ ] buf : mảng các byte dữ liệu, int count : số byte hiện có 22
  23. Lớp ByteArrayInputStream Lớp ByteArrayOutputStream  Constructors ByteArrayInputStream(byte[ ] buf) Tạo 1 a ByteArrayInputStream với bộ đệm đã có. ByteArrayInputStream(byte[ ] buf, int offset, int length) Tạo 1 a ByteArrayInputStream với bộ đệm đã có kể từ vị trí offset với kích thức length. ByteArrayOutputStream( ) Tạo 1 mảng mới làm vai trò output stream. ByteArrayOutputStream(int size) Tạo 1 mảng mới làm vai trò output stream với kích thước size bytes 23
  24. ByteArrayInputStream methods  Các hành vi của lớp cha InputStream được cụ thể hóa. 24
  25. ByteArrayOutputStream methods  Các hành vi của lớp cha OutputStream được cụ thể hóa. 25
  26. Ví dụ về ByteArray Input/Output Stream  Có dữ liệu String S = "Ve ve ve, mua he sang";  Chương trình sẽ ghi chuỗi này lên 1 ByteArrayOutputStream, sau đó lấy buffer của ByteArrayOutputStream chuyển sang 1 ByteArrayInputStream. Đọc từ ByteArrayInputStream ra biến, xuất biến.  Chương trình cũng minh họa việc truy xuất kích thước buffer 26
  27. Ví dụ về ByteArray Input/Output Stream 27
  28. 3.3- Lớp File  Giúp truy xuất thuộc tính file và thư mục.  Bao gói các đối tượng file của hệ thống máy chủ, giúp truy xuất hệ thống thư mục tập tin: Tạo/xóa thư mục-tập tin, truy xuất các thuộc tính file 28
  29. Lớp File 29
  30. Lớp File 30
  31. Minh họa truy xuất thuộc tính File Hành vi lastModified() trả về 1 số long mô tả chênh lệnh mili giây kể từ January 1, 1970, 00:00:00 GMT. Thông qua 1 đối tượng Date đổi chênh lệch mili giây này trở lại thành ngày giờ GMT 31
  32. Minh họa truy xuất thư mục / chỉ thị cho thư mục cha của thư mục hiện hành 32
  33. 3.4- Lớp FileInputStream, FileOutputStream  Là các lớp cho việc đọc/ghi file theo từng byte vật lý.  Lớp FileInputStream là con của lớp InputStream  Lớp FileOutputStream là con của lớp OutputStream 33
  34. Lớp FileInputStream  Constructors FileInputStream (File f) // f đã có FileInputStream (FileDescriptor fdesc) FileInputStream (String FileName)  Methods Ngoài những methods được override 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. 34
  35. 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. 35
  36. Minh họa 36
  37. 3.5- 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 37
  38. 3.6- 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. 38
  39. Lớp BufferInputStream 39
  40. Lớp BufferOutputStream 40
  41. 3.7- 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. 41
  42. Các lớp dẫn xuất 42
  43. Class Reader class Reader Summary - throws IOException protected Object lock : Field được dùng để đồng bộ các tác vụ của dòng protected Reader() , contructor tạo 1 dòng nhập ký tự có cơ chế đồng bộ protected Reader(Object lock) : Tạo dòng nhập với đối tượng đồng bộ đã có abstract void close() – Đóng dòng void mark(int readAheadLimit) – Đánh dấu vị trí hiện hành boolean markSupported() : Kiểm tra dòng có hỗ trợ tác vụ đánh dấu? int read() - Đọc 1 ký tự từ dòng int read(char[] cbuf) : Đọc 1 mảng ký tự, trả về đọc được (-1 khi khi hết dòng) abstract 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) int 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) boolean ready() - Kiểm tra dòng có sẵn sàng để đọc hay đang bị khóa void reset() : Reset dòng về vị trí đánh dấu cuối cùng nếu có long skip(long n) - bỏ qua n ký tự 43
  44. class Writer Class Writer Summary protected Object lock (filed) The object used to synchronize operations on this stream. protected Writer() Create a new character-stream writer whose critical sections will synchronize on the writer itself. protected Writer(Object lock) Create a new character-stream writer whose critical sections will synchronize on the given object. Writer append(char c) Appends the specified character to this writer. Writer append(CharSequence csq) Appends the specified character sequence to this writer. Writer append(CharSequence csq, int start, int end) Appends a subsequence of the specified character sequence to this writer. abstract void close() Close the stream, flushing it first. abstract void flush() Flush the stream. void write(char[] cbuf) 44
  45. 3.8- 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 45
  46. public class CharArrayReader extends Reader 46
  47. public class CharArrayWriter extends Reader 47
  48. 3.9- 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ự. 48
  49. 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 49
  50. 3.10- 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. 50
  51. DataInput interface 51
  52. DataOutput interface 52
  53. Minh họa về sử dụng DataInputStream và DataOutputStream 53
  54. 3.11- 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. 54
  55. Lớp RandomAccessFile  Constructors RandomAccessFile(File f, String mode) RandomAccessFile(String Filename, String mode) mode Ý nghĩa "r" Mở file chỉ để đọc , có thể gây lỗi IOException. "rw" Mở file đổ đọc + ghi. Nếu file chưa có thì sẽ tạo mới file này. "rws" Mở file để đọc + ghi. Nếu có hiệu chỉnh nội dung hay dữ liệu mô tả file (metadata) thì đòi hỏi phải được ghi đồng bộ. "rwd" Mở file để đọc + ghi và mỗi khi có hiệu chỉnh nội dung file thì phải được đồng bộ. 55
  56. Lớp RandomAccessFile RandomAccessFile Method Summary void close() – Đóng file. FileChannel getChannel() Lấy đối tượng FileChannel kết hợp với . FileDescriptor getFD() Lấy FileDescriptor. long getFilePointer() - Lấy vị trí truy xuất hiện hành. long length() - Lấy đ9ộ dài file. int read() Đọc 1 byte. void write(int b) ghi 1 byte vào vị trí hiện hành int read(byte[] b) Đọc 1 mảng byte- trả về số byte đọc được. void write(byte[] b) ghi mảng b int read(byte[] b, int off, int len) void write(byte[] b, int off, int len) Đọc/ghi len byte đưa vào mảng b từ vị trí off, trả về số byte đọc được. boolean readBoolean() Đọc/ghi 1 trị boolean. void writeBoolean (boolean v) byte readByte() Đọc.ghi 1 trị 8 bit có dấu. void writeByte ( int x) char readChar() - Đọc 1 ký tự Unicode . void writeChar( int v) ghi 1 ký tự 2 byte, byte cao ghi trước double readDouble() Đọc/ ghi 1 trị double. void writeDouble ( double x) – ghi dạng longbits 8 bytes 56
  57. Lớp RandomAccessFile float readFloat() Đọc/ ghi 1 trị float. void writeFloat( float x) ghi dạng intbit 4 bytes void readFully(byte[] b) Đọc ra cả 1 mảng byte từ vị trí hiện hành. void readFully(byte[] b, int off, int len) Đọc len byte từ vị trí hiện hành đưa vào vị trí off của mảng b. int readInt() Đọc 1 số integercó dấu 32 bit . void writeInt(int x) String readLine() Đọc 1 dòng kể từ vị trí hiện hành. long readLong() Đọc 1 số long có dấu (64 bit). void writeLong(long x) , 8 byte, byte cao ghi trước short readShort() Đọc 1 số short có dấu (16 bit). void writeShort(short x) int readUnsignedByte() Đọc 1 byte không dấu (8 bit). int readUnsignedShort() Đọc 1 số short không dấu (16 bit). String readUTF() Đọc 1 chuỗi. void writeUTF(String S) ghi chuỗi dạng mã UTF-8 độc lập máy chủ void seek(long pos) Nhẩy đến vị trí pos từ đầu file. void setLength(long newLength) ấn định độ dài file. int skipBytes(int n) Bỏ qua n bytes. void writeBytes(String s) Ghi chuỗi dạng nhóm các bytes. void writeChars(String s) Ghi chuỗi dạng nhóm ký tự. 57
  58. Minh họa lớp RandomAccessFile 58
  59. 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). 59
  60. 4. – 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. 60