INPUT – OUTPUT TRONG JAVA
Chia sẻ bởi Nguyễn Việt Vương |
Ngày 29/04/2019 |
83
Chia sẻ tài liệu: INPUT – OUTPUT TRONG JAVA thuộc Bài giảng khác
Nội dung tài liệu:
Chương 11
INPUT – OUTPUT TRONG JAVA
Mục tiêu
Hiểu khái niệm về dòng.
Biết các lớp đảm nhiệm việc việc xuất nhập dữ liệu trong Java.
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.
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.
Biết các interface và các lớp quản lý việc in ấn.
Nội dung
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
10.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.
Giới thiệu ...
Hai cơ chế nhập xuất dữ liệu có tương tác với user:
Nhập xuất dữ liệu trong các ứng dụng console application,
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ổ.
Giới thiệu
Buffered IO : Nhập xuất thông qua bộ đệm (một vùng vùng nhớ trung gian
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ố chỉ kết thúc khi gõ enter.
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ụ buộc xuất tường minh (flush).
Keyboard
Buffer
Variable
Buffer
Screen
Giới thiệu
Tập tin là một dữ liệu mô tả cho một thông tin đã hoàn tất. Do vậy, tập tin có thể là dữ liệu đầu vào của chương trình và cũng có thể là nơi chứa dữ liệu đầu ra của chương trình. Hầu hết những chương trình lớn đều có thao tác với tập tin.
Khi nhập xuất dữ liệu có thể gây ra lỗi Exception. Thí dụ: Nhập biến số mà gõ chữ, đọc file vào biến mà vị trí đọc là cuối file, ghi file mà đĩa đã hết dung lượng,… Như vậy, khi xuất nhập dữ liệu, người lập trình cần có biện pháp quản lý các lỗi xuất nhập bằng cú pháp
try { TácVụNhậpXuất()}
catch (Exception e)
{ System.out.println("Error: " + e.toString()); }
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ự.
Khaí 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.
Chuỗi, mảng, file đều là dòng...
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.
Buffer của dòng : mảng lưu trữ dữ liệu
Var1
Var2
Buffer
Các dữ liệu quản lý
Dòng nhập 1
Buffer
Các dữ liệu quản lý
Dòng xuất 1
Buffer
Các dữ liệu quản lý
Dòng nhập 2
Buffer
Các dữ liệu quản lý
Dòng xuất 2
data
data
data
Dữ liệu của dòng xuất có thể lại là dữ liệu của dòng nhập khác
Buffer đóng vai trò trung chuyển dữ liệu
10.3- IO classes trong gói java.io
Biến /
Đối tượng
Dòng nhập byte vật lý
Xử lý từng byte một
Dòng nhập ký tự
Xử lý theo đơn vị 2 byte
Dòng xuất byte vật lý
Xử lý từng byte một
Dòng xuất ký tự
Xử lý theo đơn vị 2 byte
Lớp trừu tượng trên cùng
java.io.InputStream
Lớp trừu tượng trên cùng
java.io.OutputStream
Lớp trừu tượng trên cùng
java.io.Reader
Lớp trừu tượng trên cùng
java.io.Writer
Phân cấp các lớp nhập theo byte vật lý
Phân cấp các lớp xuất theo byte vật lý
Phân cấp các lớp nhập theo ký tự
Phân cấp các lớp xuất theo ký tự
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
Các interface được khai báo trong java.io
10.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.
10.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ó
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
ByteArrayInputStream methods
Các hành vi của lớp cha InputStream được cụ thể hóa.
ByteArrayOutputStream methods
Các hành vi của lớp cha OutputStream được cụ thể hóa.
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
Ví dụ về ByteArray Input/Output Stream
10.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…
Lớp File....
Lớp File...
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
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
10.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
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.
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 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.
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 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
Để đọ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;
}
< Tương tự cho các tác vụ nhập số long, float,double>
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.
INPUT – OUTPUT TRONG JAVA
Mục tiêu
Hiểu khái niệm về dòng.
Biết các lớp đảm nhiệm việc việc xuất nhập dữ liệu trong Java.
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.
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.
Biết các interface và các lớp quản lý việc in ấn.
Nội dung
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
10.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.
Giới thiệu ...
Hai cơ chế nhập xuất dữ liệu có tương tác với user:
Nhập xuất dữ liệu trong các ứng dụng console application,
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ổ.
Giới thiệu
Buffered IO : Nhập xuất thông qua bộ đệm (một vùng vùng nhớ trung gian
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ố chỉ kết thúc khi gõ enter.
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ụ buộc xuất tường minh (flush).
Keyboard
Buffer
Variable
Buffer
Screen
Giới thiệu
Tập tin là một dữ liệu mô tả cho một thông tin đã hoàn tất. Do vậy, tập tin có thể là dữ liệu đầu vào của chương trình và cũng có thể là nơi chứa dữ liệu đầu ra của chương trình. Hầu hết những chương trình lớn đều có thao tác với tập tin.
Khi nhập xuất dữ liệu có thể gây ra lỗi Exception. Thí dụ: Nhập biến số mà gõ chữ, đọc file vào biến mà vị trí đọc là cuối file, ghi file mà đĩa đã hết dung lượng,… Như vậy, khi xuất nhập dữ liệu, người lập trình cần có biện pháp quản lý các lỗi xuất nhập bằng cú pháp
try { TácVụNhậpXuất()}
catch (Exception e)
{ System.out.println("Error: " + e.toString()); }
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ự.
Khaí 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.
Chuỗi, mảng, file đều là dòng...
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.
Buffer của dòng : mảng lưu trữ dữ liệu
Var1
Var2
Buffer
Các dữ liệu quản lý
Dòng nhập 1
Buffer
Các dữ liệu quản lý
Dòng xuất 1
Buffer
Các dữ liệu quản lý
Dòng nhập 2
Buffer
Các dữ liệu quản lý
Dòng xuất 2
data
data
data
Dữ liệu của dòng xuất có thể lại là dữ liệu của dòng nhập khác
Buffer đóng vai trò trung chuyển dữ liệu
10.3- IO classes trong gói java.io
Biến /
Đối tượng
Dòng nhập byte vật lý
Xử lý từng byte một
Dòng nhập ký tự
Xử lý theo đơn vị 2 byte
Dòng xuất byte vật lý
Xử lý từng byte một
Dòng xuất ký tự
Xử lý theo đơn vị 2 byte
Lớp trừu tượng trên cùng
java.io.InputStream
Lớp trừu tượng trên cùng
java.io.OutputStream
Lớp trừu tượng trên cùng
java.io.Reader
Lớp trừu tượng trên cùng
java.io.Writer
Phân cấp các lớp nhập theo byte vật lý
Phân cấp các lớp xuất theo byte vật lý
Phân cấp các lớp nhập theo ký tự
Phân cấp các lớp xuất theo ký tự
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
Các interface được khai báo trong java.io
10.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.
10.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ó
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
ByteArrayInputStream methods
Các hành vi của lớp cha InputStream được cụ thể hóa.
ByteArrayOutputStream methods
Các hành vi của lớp cha OutputStream được cụ thể hóa.
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
Ví dụ về ByteArray Input/Output Stream
10.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…
Lớp File....
Lớp File...
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
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
10.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
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.
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 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.
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 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
Để đọ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;
}
< Tương tự cho các tác vụ nhập số long, float,double>
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.
* Một số tài liệu cũ có thể bị lỗi font khi hiển thị do dùng bộ mã không phải Unikey ...
Người chia sẻ: Nguyễn Việt Vương
Dung lượng: |
Lượt tài: 5
Loại file:
Nguồn : Chưa rõ
(Tài liệu chưa được thẩm định)