Bài giảng Công nghệ Java - Chương 8: Java input/output - Trần Quang Diệu
Stream
• Stream:
– dòng thông tin giữa 2 tác nhân (mức cao)
– một dãy tuần tự các byte (mức thấp)
• Một stream được gắn với một nguồn (source), hay một đích
(destination)
• Stream operations:
– open stream
– close stream
– read
– write
– seek
• Input stream: support reading functions
• Output stream: support writing functions
• Filter stream: buffer
Trình tự đọc/ ghi dòng
open input stream
while (more information){
read information
process information
}
close input stream
open output stream
while (more information){
get information from .
write information
}
close output stream
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Công nghệ Java - Chương 8: Java input/output - Trần Quang Diệu", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
Tóm tắt nội dung tài liệu: Bài giảng Công nghệ Java - Chương 8: Java input/output - Trần Quang Diệu
CÔNG NGHỆ JAVA CH8. JAVA INPUT/OUTPUT Quang Dieu Tran PhD 4/7/2018 1 INPUT/OUTPUT STREAMS 1. Stream concepts 2. Input Streams 3. Output Streams 4. Reader 5. Writer 6. Object Serialization 7. Object Input Stream 8. Object Output Stream 4/7/2018 2 Stream concepts • Data exchange • Data exchange type: Character, Object, voice, picture, audio, video... Program File Memory Network Program information 4/7/2018 3 Stream • Stream: – dòng thông tin giữa 2 tác nhân (mức cao) – một dãy tuần tự các byte (mức thấp) • Một stream được gắn với một nguồn (source), hay một đích (destination) • Stream operations: – open stream – close stream – read – write – seek • Input stream: support reading functions • Output stream: support writing functions • Filter stream: buffer 4/7/2018 4 This image cannot currently be displayed. Hình 1: Chương trình xử lý dữ liệu từ 1 input stream Hình 2: Chương trình ghi dữ liệu ra output stream Input & Output Stream 4/7/2018 5 Trình tự đọc/ ghi dòng open input stream while (more information){ read information process information } close input stream open output stream while (more information){ get information from ... write information } close output stream Đọc thông tin từ input stream Ghi thông tin vào output stream 4/7/2018 6 Các loại stream trong package java.io • các lớp trong gói java.io được thiết kế gồm 2 nhóm chính: – Nhóm input/output stream, hay nhóm hướng byte – Nhóm reader/writer, hay nhóm hướng ký tự (unicode) 4/7/2018 7 Nhóm input/output stream • Được gọi là nhóm hướng byte, vì thao tác đọc/ghi áp dụng cho 1 hoặc nhiều byte, chỉ giới hạn xử lý các byte 8 bits ISO-Latin-1. Rất thích hợp khi cần xử lý dữ liệu nhị phân như ảnh, âm thanh, binary files... • Các input stream được mở rộng từ lớp InputStream (Abstract class) • Các output stream được mở rộng từ lớp OutputStream (Abstract class) 4/7/2018 8 Nhóm input stream 4/7/2018 9 Nhóm output stream 4/7/2018 10 Nhóm reader/writer • Được gọi là nhóm hướng ký tự, vì thao tác đọc/ghi áp dụng cho 1 hoặc nhiều ký tự Unicode (1 character = 2bytes) 4/7/2018 11 Nhóm Writer 4/7/2018 12 Các loại các stream (tt) • java IO cũng cung cấp cách thức kết gắn stream với các loại tác nhân khác như bộ nhớ, file ... • Các lớp InputStreamReader và OutputStreamWriter cung cấp sự chuyển đổi giữa stream và reader/writer • Xem bảng phân loại tóm tắt để biết thêm chi tiết 4/7/2018 13 Tổng quát về các Streams I/O Streams Mô tả khái quát M e m o r y CharArrayReader CharArrayWriter ByteArrayInput- Stream ByteArrayOutput- Stream Đọc/ghi từ/vào bộ nhớ. Tạo stream từ một mảng, tiếp theo dùng các phương thức đọc/ghi để đọc/ghi từ/vào mảng. Tác vụ đọc sẽ lấy dữ liệu từ mảng Tác vụ ghi sẽ ghi ra mảng StringReader StringWriter StringBuffer- InputStream StringReader để đọc các ký tự từ một String trong bộ nhớ. StringWriter để ghi vào String. StringBufferInputStream tương tự như StringReader. Sự khác biệt chỉ là StringBufferInputStream đọc các bytes từ một đối tượng StringBuffer 4/7/2018 14 Tổng quát về các Streams Pipe PipedReader PipedWriter PipedInputStream PipedOutputStream Hiện thực các thành phần input và output của một pipe. Pipes được dùng như một kênh truyền, nối output của một thread vào input của một thread khác. File FileReader FileWriter FileInputStream FileOutputStream Được gọi là các file streams. File streams dùng để đọc/ghi từ/vào file trên file system. Nối SequenceInput- Stream (concatenation) Nối nhiều input streams thành một input stream. 4/7/2018 15 Tổng quát về các Streams Object Serial- ization ObjectInputStream ObjectOutputStream Dùng khi cần lưu trữ, khôi phục, hoặc truyền toàn bộ đối tượng. Chuyển đổi dạng dữ liệu (Data Conver- sion) DataInputStream DataOutputStream Thuận tiện khi cần đọc/ghi các kiểu dữ liệu cơ bản (primitive data types) như int, double, ... Counting LineNumberReader LineNumberInput- Stream Theo dõi số hàng trong khi đọc 4/7/2018 16 Tổng quát về các Streams Printing PrintWriter PrintStream Rất thuận tiện khi cần kết xuất, dễ đọc với người. System.out là một đối tượng thuộc lớp PrintStream. Đệm (Buffer- ing) BufferedReader BufferedWriter bufferedInput-Stream BufferedOutput-Stream Đệm dữ liệu trong các thao tác đọc/ghi. Đệm dữ liệu cải thiện tốc độ đọc ghi vì giảm số lần truy xuất thiết bị. Lọc dữ liệu (Filtering) FilterReader FilterWriter FilterInputStream FilterOutputStream Các lớp abstract này định nghĩa các giao tiếp cho các filter streams lọc dữ liệu trong khi đọc/ghi. 4/7/2018 17 Tổng quát về các Streams C h u yển đ ổi b yte k ý tự (C on vertin g b etw een B ytes a n d C h a racters) I n p u t S t r e a m R e a d e r O u t p u t S t r e a m W r i t e r Cặp reader/writer này là cầu nối giữa các byte streams và character streams. Một InputStreamReader đọc các bytes từ một InputStream và chuyển các bytes đó thành các ký tự. Một OutputStreamWriter chuyển các ký tự sang các bytes, và ghi các bytes đó vào một OutputStream. Quá trình chuyển đổi sẽ sử dụng bộ mã mặc định nếu không được chỉ định rõ. Gọi System.getProperty("file.encoding") để lấy về tên bộ mã mặc định. 4/7/2018 18 Các lớp IO • InputStream, OutputStream, Reader và Writer là các lớp abstract: – Các lớp input stream được mở rộng từ lớp InputStream – Các lớp reader được mở rộng từ lớp Reader – Các lớp output stream được mở rộng từ lớp OutputStream – Các lớp writer được mở rộng từ lớp Writer • 2 lớp InputStream và Reader cung cấp những phương thức read tương đối giống nhau. • 2 lớp OutputStream và Writer cung cấp những phương thức write tương đối giống nhau. 4/7/2018 19 InputSream • Low-Level Input Stream Purpose of Stream • ByteArrayInputStream Reads bytes of data from an memory array • FileInputStream Reads bytes of data from a file on the local file system • PipedInputStream Reads bytes of data from a thread pipe • StringBufferInputStream Reads bytes of data from a string • SequenceInputStream Reads bytes of data from two or more low-level streams, switching from one stream to the next when the end of the stream is reached • System.in Reads bytes of data from the user console 4/7/2018 20 The java.io.InputStream Class • int available() throws java.io.IOException— returns the number of bytes currently available for reading. • void close() throws java.io.IOException— closes the input stream and frees any resources (such as file handles or file locks) associated with the input stream. • int read() throws java.io.IOException— returns the next byte of data from the stream. When the end of the stream is reached, a value of –1 is returned. • int read(byte[] byteArray) throws java.io.IOException— reads a sequence of bytes and places them in the specified byte array. This method returns the number of bytes successfully read, or –1 if the end of the stream has been reached. • int read(byte[] byteArray, int offset, int length) throws java.io.IOException, java.lang.IndexOutOfBoundsException— reads a sequence of bytes, placing them in the specified array at the specified offset, and for the specified length, if possible. 4/7/2018 21 The java.io.InputStream Class • long skip(long amount) throws java.io.IOException— reads, but ignores, the specified amount of bytes. These bytes are discarded, and the position of the input stream is updated. The skip method returns the number of bytes skipped over, which may be less than the requested amount. • The following code fragment reads 10 bytes from the InputStream in and stores them in the byte array input. However, if end of stream is detected, the loop is terminated early: byte[] input = new byte[10]; for (int i = 0; i < input.length; i++) { int b = in.read( ); if (b == -1) break; input[i] = (byte) b; } 4/7/2018 22 The java.io.InputStream Class • For example, you may try to read 1 024 bytes from a network connection, when only 512 have actually arrived from the server. The rest are still in transit. They'll arrive eventually, but they aren't available now. byte[] input = new byte[1024]; int bytesRead = in.read(input); • It attempts to read 1 024 bytes from the InputStream in into the array input. However, if only 512 bytes are available, then bytesRead will be set to 512. To guarantee that all the bytes you want are actually read, you must place the read in a loop that reads repeatedly until the array is filled. int bytesRead = 0; int bytesToRead = 1024; byte[] input = new byte[bytesToRead]; while (bytesRead < bytesToRead) { bytesRead += in.read(input, bytesRead, bytesToRead - bytesRead); } 4/7/2018 23 The java.io.File Class • An abstract representation of file and directory pathnames. • For UNIX platforms, the prefix of an absolute pathname is always "/". Relative pathnames have no prefix. • For Microsoft Windows platforms, the prefix of a pathname that contains a drive specifier consists of the drive letter followed by ":" and possibly followed by "\\" if the pathname is absolute (D:\\myfolder\\t.txt). A relative pathname that does not specify a drive has no prefix. • public File(File parent, String child) – Creates a new File instance from a parent abstract pathname and a child pathname string. • public File(String parent, String child) – Creates a new File instance from a parent pathname string and a child pathname string. 4/7/2018 24 The java.io.File Class • public File(String pathname) – Creates a new File instance by converting the given pathname string into an abstract pathname. If the given string is the empty string, then the result is the empty abstract pathname. • public String getPath() – Converts this abstract pathname into a pathname string. • public boolean isAbsolute() – Tests whether this abstract pathname is absolute. • public String getAbsolutePath() – Returns the absolute pathname string of this abstract pathname. • public boolean canRead() – Tests whether the application can read the file denoted by this abstract pathname. 4/7/2018 25 The java.io.File Class • public boolean canWrite() – Tests whether the application can modify the file denoted by this abstract pathname • public boolean exists() – Tests whether the file or directory denoted by this abstract pathname exists. • public boolean isDirectory() – Tests whether the file denoted by this abstract pathname is a directory. • public boolean isFile() – Tests whether the file denoted by this abstract pathname is a normal file. • public boolean isHidden() – Tests whether the file named by this abstract pathname is a hidden file. 4/7/2018 26 The java.io.File Class • public long length() Returns the length (the zise in Kbyte) of the file denoted by this abstract pathname. The return value is unspecified if this pathname denotes a directory. • public boolean delete() Deletes the file or directory denoted by this abstract pathname. If this pathname denotes a directory, then the directory must be empty in order to be deleted. • public String[] list() Returns an array of strings naming the files and directories in the directory denoted by this abstract pathname. • public String[] list(FilenameFilter filter) Returns an array of strings naming the files and directories in the directory denoted by this abstract pathname that satisfy the specified filter. The behavior of this method is the same as that of the list() method, except that the strings in the returned array must satisfy the filter. If the given filter is null then all names are accepted. 4/7/2018 27 The java.io.File Class • public File[] listFiles() Returns an array of abstract pathnames denoting the files in the directory denoted by this abstract pathname. • public File[] listFiles(FilenameFilter filter) Returns an array of abstract pathnames denoting the files and directories in the directory denoted by this abstract pathname that satisfy the specified filter. • public boolean mkdir() Creates the directory named by this abstract pathname. • public boolean mkdirs() Creates the directory named by this abstract pathname, including any necessary but nonexistent parent directories. Note that if this operation fails it may have succeeded in creating some of the necessary parent directories. 4/7/2018 28 The java.io.File Class //List of all files in D: with extention tgz import java.io.*; import java.util.*; public class DLister { public static void main(String[] args) { File path = new File("D:\\"); String[] list; list = path.list(new DirFilter(".tgz")); for(int i = 0; i < list.length; i++) System.out.println(list[i]); } } class DirFilter implements FilenameFilter { String afn; DirFilter(String afn) { this.afn = afn; } public boolean accept(File dir, String name) { String f = new File(name).getName(); return f.indexOf(afn) != -1; } } 4/7/2018 29 Exercise • public boolean deleteDir(String path) • public boolean find(String path, String filePattern) • public boolean find(String path, String pattern) 4/7/2018 30 The java.io.FileInputStream Class • A FileInputStream obtains input bytes from a file in a file system. What files are available depends on the host environment. • FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader. • public FileInputStream(File file) throws FileNotFoundException Creates a FileInputStream by opening a connection to an actual file, the file named by the File object file in the file system. A new FileDescriptor object is created to represent this file connection. • public FileInputStream(String name) throws FileNotFoundException Creates a FileInputStream by opening a connection to an actual file, the file named by the path name name in the file system. 4/7/2018 31 The java.io.FileInputStream Class • public int read() throws IOException – Reads a byte of data from this input stream. This method blocks if no input is yet available. – Returns: the next byte of data, or -1 if the end of the file is reached. • public int read(byte[] b) throws IOException • public int read(byte[] b, int off, int len) – Reads up to b.length bytes of data from this input stream into an array of bytes. This method blocks until some input is available. – Parameters: • b - the buffer into which the data is read. • off - the start offset of the data. • len - the maximum number of bytes read. – Returns: the total number of bytes read into the buffer, or -1 if there is no more data because the end of the file has been reached. 4/7/2018 32 The java.io.FileInputStream Class • public long skip(long n) throws IOException – Skips over and discards n bytes of data from the input stream. – Parameters: n - the number of bytes to be skipped. – Returns: the actual number of bytes skipped. – Throws: IOException - if n is negative, or if an I/O error occurs. • public int available() throws IOException – Retu ... e characters into bytes using a specified encoding and writes the bytes onto an underlying output stream. 4/7/2018 80 Writers • Like OutputStream, the Writer class is never used directly, only polymorphically through one of its subclasses. It has five write( ) methods as well as a flush( ) and a close( ) method: • protected Writer( ) • protected Writer(Object lock) • public abstract void write(char[] text, int offset, int length) • throws IOException • public void write(int c) throws IOException • public void write(char[] text) throws IOException • public void write(String s) throws IOException • public void write(String s, int offset, int length) throws • IOException • public abstract void flush( ) throws IOException • public abstract void close( ) throws IOException 4/7/2018 81 Writers char[] network = {'N', 'e', 't', 'w', 'o', 'r', 'k'}; w.write(network, 0, network.length); • The same task can be accomplished with these other methods as well: for (int i = 0; i < network.length; i++) w.write(network[i]); w.write("Network"); w.write("Network", 0, 7); • If it's using big-endian Unicode, then it will write these 14 bytes (shown here in hexadecimal) in this order: 00 4E 00 65 00 74 00 77 00 6F 00 72 00 6B • On the other hand, if w uses little-endian Unicode, this sequence of 14 bytes is written: 4E 00 65 00 74 00 77 00 6F 00 72 00 6B 00 • If uses Latin-1, UTF-8, or MacRoman, this sequence of seven bytes is written: 4E 65 74 77 6F 72 6B 4/7/2018 82 java.io.FileWriter • Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream. • public FileWriter(String fileName) throws IOException Constructs a FileWriter object given a file name. • public FileWriter(String fileName, boolean append) throws IOException Constructs a FileWriter object given a file name with a boolean indicating whether or not to append the data written. • public FileWriter(File file) throws IOException Constructs a FileWriter object given a File object. • public FileWriter(File file, boolean append) throws IOException Constructs a FileWriter object given a File object. If the second argument is true, then bytes will be written to the end of the file rather than the beginning. • Methods inherited from class java.io.OutputStreamWriter: close, flush, getEncoding, write 4/7/2018 83 Text Stream • Text stream cho phép user nhìn stream dưới dạng “đọc được” (readable) – InputStreamReader, OutputStreamWriter còn cung cấp thêm khả năng chuyển đổi stream reader/writer, khả năng làm việc với các bảng mã khác nhau – BufferedReader cung cấp cách đọc ra từng hàng từ một stream – BufferedWriter cung cấp cách thức ghi các chuỗi ra stream dưới dạng đọc được – PrintWriter cung cấp cách thức ghi các chuỗi, số nguyên, số thực, ... ra stream dưới dạng đọc được 4/7/2018 84 P r in tW r it er P rin tW rite r(arg0 : O utputS tream , auto F lus h : boo lean ) P rin tW rite r(arg0 : O utputS tream ) P rin tW rite r(arg0 : W rite r, au toF lus h : boo lean) P rin tW rite r(arg0 : W rite r) flus h() : vo id c los e() : vo id c hec k E rror() : boo lean s etE rror() : vo id w rite (arg0 : in t ) : vo id w rite (arg0 : c har[ ] , a rg1 : in t , a rg2 : in t ) : vo id w rite (arg0 : c har[ ] ) : vo id w rite (arg0 : S tring , a rg 1 : in t , a rg2 : in t ) : vo id w rite (arg0 : S tring) : vo id prin t(a rg0 : bo o lea n) : vo id prin t(a rg0 : c h ar) : vo id prin t(a rg0 : in t ) : vo id prin t(a rg0 : long) : vo id prin t(a rg0 : floa t) : vo id prin t(a rg0 : do ub le ) : vo id prin t(a rg0 : c h ar[ ] ) : vo id prin t(a rg0 : S tring) : vo id prin t(a rg0 : O b jec t ) : vo id prin t ln () : vo id prin t ln (arg0 : boo lean) : vo id prin t ln (arg0 : c har) : vo id prin t ln (arg0 : in t ) : vo id prin t ln (arg0 : long) : vo id prin t ln (arg0 : floa t) : vo id prin t ln (arg0 : doub le) : vo id prin t ln (arg0 : c har[ ] ) : vo id prin t ln (arg0 : S tring) : vo id prin t ln (arg0 : O b jec t) : vo id (fro m io ) 4/7/2018 85 BufferedReader BufferedReader(arg0 : Reader) BufferedReader(arg0 : Reader, arg1 : int) read() : int read(arg0 : char[], arg1 : int, arg2 : int) : int readLine(arg0 : boolean) : String readLine() : String skip(arg0 : long) : long ready() : boolean markSupported() : boolean mark(arg0 : int) : void reset() : void close() : void (from io) Reader (from io) BufferedReader 4/7/2018 86 BufferedWriter Writer (from io) BufferedWriter BufferedWriter(arg0 : Writer, arg1 : int) BufferedWriter(arg0 : Writer) flushBuffer() : void write(arg0 : int) : void write(arg0 : char[], arg1 : int, arg2 : int) : void write(arg0 : String, arg1 : int, arg2 : int) : void newLine() : void flush() : void close() : void (from io) 4/7/2018 87 java.io.OutputStreamWriter • public OutputStreamWriter(OutputStream out, String charsetName) throws UnsupportedEncodingException Create an OutputStreamWriter that uses the named charset. • Charset Description US-ASCII Seven-bit ASCII, a.k.a. ISO646-US, a.k.a. the Basic Latin block of the Unicode character set ISO-8859-1 ISO Latin Alphabet No. 1, a.k.a. ISO-LATIN-1 UTF-8 Eight-bit UCS Transformation Format UTF-16BE Sixteen-bit UCS Transformation Format, big-endian byte order UTF-16LE Sixteen-bit UCS Transformation Format, little-endian byte order UTF-16 Sixteen-bit UCS Transformation Format, byte order identified by an optional byte-order mark 4/7/2018 88 java.io.OutputStreamWriter • public OutputStreamWriter(OutputStream out) Create an OutputStreamWriter that uses the default character encoding. • public OutputStreamWriter(OutputStream out, CharsetEncoder enc) Create an OutputStreamWriter that uses the given charset encoder. • public String getEncoding() Return the name of the character encoding being used by this stream. • public void write(int c) throws IOException Write a single character. • public void write(char[] cbuf, int off, int len) throws IOException Write a portion of an array of characters. 4/7/2018 89 java.io.OutputStreamWriter • public void write(String str, int off, int len) throws IOException Write a portion of a string. • public void flush() throws IOException Flush the stream. • public void close() throws IOException Close the stream. 4/7/2018 90 OutputStreamWriter demo • import java.io.*; public class OutputStreamToWriterDemo{ public static void main(String args[]){ try{ OutputStream output = new FileOutputStream("utf8.txt"); // Create an OutputStreamWriter OutputStreamWriter writer = new OutputStreamWriter (output,"UTF-8"); // Write to file using a writer writer.write ("Phạm Văn Tính"); // Flush and close the writer, to ensure it is written writer.flush(); writer.close(); } catch (IOException ioe){ System.err.println ("I/O error : " + ioe); }}} 4/7/2018 91 java.io.InputStreamReader • An InputStreamReader is a bridge from byte streams to character streams: It reads bytes and decodes them into characters using a specified charset. The charset that it uses may be specified by name or may be given explicitly, or the platform's default charset may be accepted. • public InputStreamReader(InputStream in) – Create an InputStreamReader that uses the default charset. • public InputStreamReader(InputStream in, String charsetName) throws UnsupportedEncodingException – Create an InputStreamReader that uses the named charset. • public String getEncoding() – Return the name of the character encoding being used by this stream. 4/7/2018 92 java.io.InputStreamReader • public int read() throws IOException – Read a single character. • public int read(char[] cbuf, int offset, int length) throws IOException – Read characters into a portion of an array. • public boolean ready() throws IOException – Tell whether this stream is ready to be read. An InputStreamReader is ready if its input buffer is not empty, or if bytes are available to be read from the underlying byte stream. • public void close() throws IOException 4/7/2018 93 Charset Translation public class InputStreamReaderDemo { public static void main(String args[]){ try{ OutputStream output = new FileOutputStream("utf8_16.txt"); // Create an OutputStreamWriter OutputStreamWriter writer = new OutputStreamWriter (output, "UTF-16"); InputStream input = new FileInputStream("utf8.txt"); InputStreamReader reader = new InputStreamReader(input, "UTF-8"); char[] buff = new char[100]; // Write to file using a writer int rNumber = reader.read(buff); System.out.println("Number of char: "+rNumber); writer.write(buff,0,rNumber); // Flush and close the writer, to ensure it is written writer.flush(); writer.close(); reader.close(); } catch (IOException ioe){ System.err.println ("I/O error : " + ioe); }}} 4/7/2018 94 Complete example • Student List 4/7/2018 95 Object Streams • Using a fixed-length record format is a good choice if you need to store data of the same type. However, objects that you create in an object-oriented program are rarely all of the same type. • If we want to save files that contain this kind of information, we must first save the type of each object and then the data that defines the current state of the object. When we read this information back from a file, we must: – Read the object type; – Create a blank object of that type; – Fill it with the data that we stored in the file. • It is entirely possible (if very tedious) to do this by hand. However, Sun Microsystems developed a powerful mechanism called object serialization to read/write objects from/into the file. 4/7/2018 96 Storing Objects of Variable Type • To save object data, you first need to open an ObjectOutputStream object: • ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream( “student.dat")); • Now, to save an object, you simply use the writeObject method of the ObjectOutputStream class as in the following fragment: • //create objects Student hoa = new Employee(“Trần Thị Hoa", 1980, “CD02”); Student vinh = new Employee(“Lương Thế Vinh", 1981, “DH03”); • //Storing objects into stream out.writeObject(hoa); out.writeObject(vinh); 4/7/2018 97 Reading Objects back • First get an ObjectInputStream object • ObjectInputStream in = new ObjectInputStream(new FileInputStream("employee.dat")); • Then, retrieve the objects in the same order in which they were written, using the readObject method. • Student st1 = (Student)in.readObject(); Student st2 = (Student)in.readObject(); . • When reading back objects, you must carefully keep track of the number of objects that were saved, their order, and their types. Each call to readObject reads in another object of the type Object. You, therefore, will need to cast it to its correct type. 4/7/2018 98 Serializable interface • you need to make to any class that you want to save and restore in an object stream. The class must implement the Serializable interface: • class Employee implements Serializable { . . . } • The Serializable interface has no methods, so you don't need to change your classes in any way. • To make a class serializable, you do not need to do anything else. • Writing an array is done with a single operation: • Student[] stList = new Student[3]; . . . out.writeObject(stList); • Similarly, reading in the result is done with a single operation. However, we must apply a cast to the return value of the readObject method: • Student[] newStList = (Student[])in.readObject(); 4/7/2018 99 Student List using Object Streams public class SerialStudent implements Serializable{ private String name; private int age; private String cl; public SerialStudent(String n, int a, String c){ name = n; age = a; cl = c; } public String getName() { return name; } public int getAge() { return age; } public String getCl(){ return cl; } public String toString() { return getClass().getName() + "[Name=" + name + ",Age=" + age + ",Class=" + cl + "]"; } public void exportData(PrintWriter out){ out.println(name + "|" + age + "|" + cl); }} 4/7/2018 100 Student List using Object Streams public class SerialTest { public static void main(String[] args) { SerialStudent[] st = new SerialStudent[3]; st[0] = new SerialStudent("Phạm Thị Mỹ Hạnh", 20, "TC02"); st[1] = new SerialStudent("Trần Thị Hoa", 18, "CD02"); st[2] = new SerialStudent("Nguyễn Vãn Vệ", 19, "DH03"); try { // save all students records to the file studentemployee.dat ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("SerialStudent.dat")); out.writeObject(st); out.close(); // retrieve all records into a new array ObjectInputStream in = new ObjectInputStream(new FileInputStream("SerialStudent.dat")); try{ SerialStudent[] newSt = (SerialStudent[])in.readObject(); // print the newly read student records for (int i = 0; i < newSt.length; i++) System.out.println(newSt[i]); } catch (ClassNotFoundException e) {}; in.close(); .. 4/7/2018 101 java.io.ObjectOutputStream • ObjectOutputStream(OutputStream out) creates an ObjectOutputStream so that you can write objects to the specified OutputStream. • void writeObject(Object obj) writes the specified object to the ObjectOutputStream. This method saves the class of the object, the signature of the class, and the values of any non-static, non-transient field of the class and its superclasses. 4/7/2018 102 java.io.ObjectInputStream • ObjectInputStream(InputStream is) creates an ObjectInputStream to read back object information from the specified InputStream. • Object readObject() reads an object from the ObjectInputStream. In particular, this reads back the class of the object, the signature of the class, and the values of the nontransient and nonstatic fields of the class and all of its superclasses. It does deserializing to allow multiple object references to be recovered. 4/7/2018 103 InputStream Summary FileInputStream DataInputStream In p u tS tr ea m Int Float Double String Char Object R ea d er InputStreamReader FileReader char BufferedReader line CharSet ObjectInputStream Byte 4/7/2018 104 OutputStream Summary FileOutputStream DataOutputStream O u tp u tS tr e a m Int Float Double String Char String line W r it e r OutputStreamWriter er FileWriter char PrintWriter CharSet String line byte Object ObjectOutputStream 4/7/2018 105 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. 4/7/2018 106
File đính kèm:
- bai_giang_cong_nghe_java_chuong_8_java_inputoutput_tran_quan.pdf