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

