Stream I/O
Modern Programming Languages
11
สตรีม (Stream I/O) 11.1
สตรีม (Stream)
ภาษาจาวาทําการจัดการกับขอมูลอินพุตและเอาตพุตโดยใชหลักการของสตรีม (Stream) ซึ่งสตรีม เปรียบเสมือนทอรับสงขอมูล จากตนทาง(source) ไปยังปลายทาง (sink) โดยที่ตนทางเปนตําแหนงเริ่มตนของ สตรีม เรียกวา input stream และปลายทางเปนตําแหนงสิ้นสุดของสตรีม เรียกวา output stream ในการพัฒนา โปรแกรมเพื่ อ สง ขอ มูล จากต น ทางไปยั ง ปลายทางนั้ น สตรีม ชว ยทํ า ใหผู เขี ย นโปรแกรมไมจํ า เปน ตอ งทราบ รายละเอียดการติดตอกับฮารดแวรหรือซอฟตแวรที่ใชในการรับสงขอมูล เพียงแตรูจักการรับสงขอมูลผานสตรีม เชน การอาน/เขียนไฟล การติดตอดวย socket ผานเครือขาย โดยภาษาจาวาแบงสตรีมออกเปน 2 ประเภทดังนี้ • •
byte stream character stream
11.1.1 แพ็คเกจ java.io
คลาสที่เกี่ยวของกับอินพุตและเอาตพุต ถูกกําหนดอยูในแพ็คเกจ java.io ประกอบไปดวยคลาสพื้นฐาน 4 คลาส คือ • InputStream เปนคลาสที่ใชในการสรางออบเจกตที่เปนสตรีมในการรับชนิดขอมูลแบบ byte • OutputStream เปนคลาสที่ใชในการสรางออบเจกตที่เปนสตรีมในการสงชนิดขอมูลแบบ byte • Reader เปนคลาสที่ใชในการสรางออบเจกตที่เปนสตรีมในการรับชนิดขอมูลแบบ char • Writer เปนคลาสที่ใชในการสรางออบเจกตที่เปนสตรีมในการสงชนิดขอมูลแบบ char 11.1.2 คลาสประเภท Byte Stream
ประกอบไปดวยคลาสพื้นฐานในการจัดการอินพุตและเอาตพุต คือ InputStream และ OutputStream คลาสทั้งสองเปนคลาสแบบ abstract class ซึ่งไมสามารถสรางออบเจกตได แตคลาสทั้งสองจะมี subclass ซึ่งจะ ใชในการสรางออบเจกต สําหรับการรับสงขอมูลแบบ byte เชน FileInputStream และ FileOutputStream เปน คลาสที่ใชในการสรางออบเจกตสําหรับตนทางปลายทางที่เปนไฟล
[email protected]
1/12
Stream I/O
Modern Programming Languages FileInputStream ObjectInputStream PipedInputStream DataInputStream SequenceInputStream
InputStram
PushbackInputStream FilterInputStream BufferedInputStream StringBufferInputStream LineNumberInputStream ByteArrayInputStream
รูปที่ 11.1 คลาสประเภท InputSream FileOutputStream ObjectOutputStream OutputStram
PipedOutputStream
DataOtuputStream
FilterOutputStream
BufferedOutputStream
ByteArrayOutputStream
PrintStream
รูปที่ 11.2 คลาสประเภท OutputSream คลาส InputStream ใชในการอานขอมูลของสตรีมที่เปนชนิด byte คลาส InputStream จะนําขอมูลจากโหนดตน ทางเขามาในสตรีม และอานขอมูลจากสตรีมโดยมีเมธอดที่ใชสําหรับการอานขอมูลที่เปน byte หรือ อะ เรยของ byte •
o
public abstract int read() throws IOException เปนเมธอดที่ใชในการอานขอมูลจากสตรีมมา 1 ไบตโดยสงคากลับมาเปนขอมูลที่อาน
ไดระหวาง 0 ถึง 255 และจะสงคากลับเปน -1 ถาไมมีขอมูลจากโหนดตนทาง ในเมธอดนี้ จะสงออบเจกตชนิด IOException ในกรณีที่มีขอผิดพลาดเกิดขึ้นจากการอานขอมูล ดังนั้นเมื่อเรียกใชงานเมธอด จะตองมีการดักจับขอผิดพลาดดวยบล็อก try-catch o
public int read(byte b[]) throws IOException
เปนเมธอดที่ใชในการอานขอมูลจากโหนดตนทางทีละหลายไบต โดยทําการอา น ขอมูลครั้งละไมเกินจํานวนของสมาชิกของอะเรยชนิด byte ที่ชื่อ b โดยเมธอดนี้จะสง จํานวนไบตที่อานไดกลับมา และจะสงคากลับเปน -1 ถาไมมีขอมูลจากโหนดตนทาง ใน เมธอดนี้จะสงออบเจกตชนิด IOException ในกรณีที่มีขอผิดพลาดเกิดขึ้นจากการอาน ขอมูล ดังนั้นเมื่อเรียกใชงานเมธอด จะตองมีการดักจับขอผิดพลาดดวยบล็อก try-catch
[email protected]
2/12
Stream I/O
Modern Programming Languages
ตัวอยาง การรับคาเขาจากคียบอรด
ผลลัพธที่ได • เมื่อรันโปรแกรม จะรอรับคาเขาจากคียบอรด :
•
เมื่อพิมพขอความจะนําคามาเก็บไวในสตรีมเปนชนิด byte :
•
แสดงขอความ โดยการสรางออบเจกต String แลวสงคา b เขาไปเปนคาเริ่มตน :
คลาส OutputStream ใชในการสงขอมูลลงในสตรีมที่เปนชนิด byte คลาส OutputStream จะมีเมธอดที่ใชสําหรับ การสงขอมูลที่เปน byte หรือ อะเรยของ byte
•
o
public abstract void write(int b) throws IOException
เปนเมธอดที่ใชในการเขียนสงขอมูลของสตรีมที่เปนชนิด byte โดยเขียนขอมูลเพียง 8 บิตสุดทายของขอมูล ในเมธอดนี้จะสงออบเจกตชนิด IOException ในกรณีที่มี ขอผิดพลาดเกิดขึ้นจากการอานขอมูล ดังนั้นเมื่อเรียกใชงานเมธอด จะตองมีการดักจับ ขอผิดพลาดดวยบล็อก try-catch o
public void write(byte b[]) throws IOException
เปนเมธอดที่ใชในการเขียนสงขอมูลของสตรีมที่เปนอะเรยชนิด byte ในกรณีที่มี ขอผิดพลาดเกิดขึ้นจากการอานขอมูล ดังนั้นเมื่อเรียกใชงานเมธอด จะตองมีการดักจับ ขอผิดพลาดดวยบล็อก try-catch นอกจากนี้คลาส ยังมีเมธอดอื่นๆ เชน o
public void close() throws IOException
เปนเมธอดที่ใชในการปดสตรีม o
public void flush() throws IOException
เปนเมธอดที่ใชในกรณีที่สตรีมมีบัฟเฟอรในการเก็บขอมูลไวชั่วคราว ในการเรียกใช เมธอดนี้จะเปนการเขียนขอมูลที่อยูในบัฟเฟอรลงสตรีม
[email protected]
3/12
Stream I/O
Modern Programming Languages
ตัวอยาง การอานและเขียนไฟล ประเภท Byte Stream
พิจารณาจากโปรแกรมขางตน • fin.read() ทําการอานไฟล test.txt เพื่อไปเขียนที่ไฟล testCopy.txt ดวยคําสั่ง fout.write(i)
ผลลัพธที่ไดทางหนาจอ
[email protected]
4/12
Stream I/O
11.2
Modern Programming Languages
คลาสประเภท Character Stream
คลาสพื้นฐานในการจัดการอินพุตและเอาตพุต ที่เปนขอมูลแบบ char มีอยู 2 คลาสคือ Reader และ Writer คลาสทั้งสองเปนคลาสแบบ abstract class ซึ่งไมสามารถสรางออบเจกตได แตคลาสทั้งสองจะมี subclass ซึ่งจะใชในการสรางออบเจกต สําหรับการจัดการกับโหนดตนทางและปลายทางในรูปแบบตางๆ BufferedReader
LineNumberReader
CharArrayReader StringReader Reader InputStreamReader
FileReader
PipedReader FilterReader
PushbackReader
รูปที่ 11.3 คลาสประเภท Reader BufferedWriter CharArrayWriter StringWriter InputStreamWriter Writer
FileWriter
PrintWriter PipedWriter FilterWriter
รูปที่ 11.4 คลาสประเภท Writer •
•
คลาส Reader ใชในการอานขอมูลของสตรีมที่เปนชนิด char คลาส Reader InputStream ทํางานสอดคลองกันแตจะรับขอมูลที่เปนชนิด char
มีเมธอดที่เหมือนกับคลาส
o public abstract int read() throws IOException o public int read(char c[]) throws IOException คลาส Writer
ใชใ นการเขียนข อมูลของสตรีม ที่ เปน ชนิด char คลาส Writer OutputStream ทํางานสอดคลองกันแตจะสงขอมูลที่เปนชนิด char o o
มีเ มธอดที่เ หมื อนกั บ คลาส
public abstract void writer() throws IOException public void writer(char c[]) throws IOException
[email protected]
5/12
Stream I/O
11.3 •
Modern Programming Languages
การเชื่อมตอออบเจกตของคลาส โดยทั่วไปโปรแกรมภาษาจาวาจะใชออบเจกตประเภท Stream มากกวาหนึ่งออบเจกต โดยจะเชื่อมออบ เจกตของ Stream ตางๆเขาดวยกันเพื่อใชในการแปลงชนิดขอมูลประเภทตางๆ byte
int String …
File FileInputStream
DataInputStream
จากรู ป ด า นบน เป น การเชื่ อ มต อ ออบเจกต ค ลาสประเภท FileInputStream เข า กั บ คลาสประเภท DataInputStream โดยออบเจกตของ FileInputStream จะอานขอมูลของไฟลเขามาโดยมีชนิดขอมูลแบบ byte สวนออบเจกตของ DataInputStream จําทําการแปลงขอมูลแบบไบตใหเปนชนิดขอมูลอื่นๆ ทําใหมีเมธอดในการ อานขอมูลมากขึ้น การอานและเขียนไฟลสามารถทําได โดยใชคลาส ดังนี้ • โหนดของสตรี ม ชนิ ดไฟล สํ า หรับ อ า นและเขียนข อ มูล ชนิด byte คือ FileInputStream และ FileOutputStream •
โหนดของสตรีมชนิดไฟล สําหรับอานและเขียนขอมูลชนิด character
คือ FileReader และ
FileWriter
ตารางแสดงเมธอดที่ ใ ช ใ นการแปลงข อ มู ล ของคลาส
DataInputStream
และ คลาส
DataOutputStream
เมธอด DataInputStream boolean readBoolean() byte readByte() char readchar() short readShort() int readInt() long readLong() float readFloat() double readDouble() String readUTF()
[email protected]
เมธอด DataOutputStream void writeBoolean(boolean b) void writeByte(int b) void writeByte(String s) void writeChar(int c) void writeShort(int s) void writeInt(int i) void writeLong(long l) void writeFloat(float f) void writeDouble(double d) void writeUTF(String s)
6/12
Stream I/O
Modern Programming Languages
ตัวอยาง การเชื่อมตอออบเจกตของคลาส FileOutputStream ที่ใชในการเขียนขอมูลลงไฟล โดยเก็บ ชนิดขอมูลเปน byte ดวยออบเจกตของคลาส DataOutputStream
พิจารณาจากโปรแกรมขางตน •
FileOutputStream(String fileName) ใชในการเขียนไฟลที่ตองการ
•
DataOutputStream(OutputStream out) สรางบัฟเฟอรเก็บขอมูลชนิด byte แลวทําการเขียนลง
ไฟล testWrite.txt
[email protected]
7/12
Stream I/O
Modern Programming Languages
ตัวอยาง การเชื่อมตอออบเจกตของคลาส FileInputStream ที่อานขอมูลเขามาโดยมีชนิดขอมูลเปน byte เขากับออบเจกตของคลาส DataInputStream
พิจารณาจากโปรแกรมขางตน •
FileInputStream(String fileName) ใชในการอานไฟลที่ตองการ
•
DataInputStream(InputStream in) testWrite.txt
สรางบัฟเฟอรเก็บขอมูลชนิด byte โดยทําการอานจากไฟล
ผลลัพธที่ได
11.4 • •
•
สรุปคลาสประเภท stream ที่สําคัญ และ DataOutputStream เปนคลาสที่ใชในการแปลงชนิดขอมูลระหวางชนิดขอมูล แบบ byte กับชนิดขอมูลแบบอื่นๆ BufferedInputStream และ BufferedOutputStream เปนคลาสที่มีบัฟเฟอรสําหรับชนิดขอมูล byte อยูภายในเพื่อใหสามารถอานหรือเขียนขอมูลขนาดใหญ ซึ่งจะชวยเพิ่มประสิทธิภาพในการอานหรือ เขียนขอมูล PrintStream เปนคลาสที่ในการเขียนขอความที่เปน String ที่แปลงมาจากชนิดขอมูลแบบ byte ออบ เจกตที่ชื่อ out และ err ที่อยูในคลาสที่ชื่อ System เปนตัวอยางของออบเจกตที่ใชคลาสนี้ DataInputStream
[email protected]
8/12
Stream I/O • •
Modern Programming Languages
และ BufferedWriter เปนคลาสที่มีบัฟเฟอรสําหรับชนิดขอมูลแบบ char เพื่อให สามารถอานหรือเขียนขอมูลใหญได InputStreamReader และ InputStreamWriter เปนคลาสที่ใชในการแปลงชนิดขอมูลระหวาขอมูล แบบ char กับชนิดขอมูลแบบอื่นๆ BufferedReader
ตัวอยาง ไฟล Character Stream
พิจารณาจากโปรแกรมขางตน •
FileReader(String fileName) ใชในการอานไฟลที่ตองการ
•
BufferedReader(Reader in)
สรางบัฟเฟอรเก็บขอมูลชนิด char โดยทําการอานจาก
ไฟล reader.txt •
FileWriter(String fileName) ใชในการเขียนไฟลที่ตองการ
•
BufferedWriter(Writer in) สรางบัฟเฟอรเก็บขอมูลชนิด char โดยทําการเขียนลงไฟล writer.txt
ผลลัพธที่ไดทางหนาจอ
[email protected]
9/12
Stream I/O
Modern Programming Languages
FileReader
[email protected]
FileWriter
10/12
Stream I/O
Modern Programming Languages
แบบฝกหัด ใหทําการอานขอมูลจากไฟล testData.txt ซึ่งมีขอมูลดังรูป
1.
โดยทําการแสดงผลออกทางหนาจอดังนี้
2.
โดยทําการแสดงผลออกทางหนาจอดังนี้
3.
ใหทําการเรียงลําดับคําที่ไดในขอ 2. sortData.txt ดังรูป
[email protected]
โดยเรียงลําดับตามพจนานุกรม a-z
แลวเขียนขอมูลลงไฟล
11/12
Stream I/O
[email protected]
Modern Programming Languages
12/12