lec08 :: class input/output

50
Lec08 :: class input/output คคคคคคคคคคคคคคคคคคคคค (Input/Output Classes) คคค ค. คคคคคคค คคค คคคคค http:// www.siam2dev.com

Upload: thai

Post on 11-Jan-2016

63 views

Category:

Documents


4 download

DESCRIPTION

Lec08 :: class input/output. คลาสอินพุต และ เอาท์พุต (Input/Output Classes) โดย อ. นัฐพงศ์ ส่งเนียม http://www.siam2dev.com. วัตถุประสงค์. อธิบายความหมายและประเภทของ stream อธิบายองค์ประกอบที่สำคัญของแพคเก็จ java.io แนะนำคลาสและเมธอดของคลาส InputStream และ OutputStream - PowerPoint PPT Presentation

TRANSCRIPT

Lec08 :: class input/output

คลาสอิ�นพุตและเอิาท์�พุต(Input/Output Classes)

โดย อิ . น�ฐพุงศ์� ส�งเน�ยมhttp://

www.siam2dev.com

วั�ตถุประสงค� อิธิ�บายควัามหมายและประเภท์ขอิง stream อิธิ�บายอิงค�ประกอิบท์�%ส&าค�ญขอิงแพุคเก(จ java.io

แนะน&าคลาสและเมธิอิดขอิงคลาส InputStream และOutputStream

แนะน&าคลาสและเมธิอิดขอิงคลาส Reader และ Writer

อิธิ�บายควัามแตกต�างระหวั�างคลาส Reader และ Writer ก�บ stream

อิธิ�บายการสร*างและใช้* stream แบบต�างๆ

วั�ตถุประสงค� แนะน&าคลาสและเมธิอิดขอิงคลาส File

อิธิ�บายการอิ�าน เข�ยนและอิ�พุเดท์ข*อิม.ลขอิงคลาสRandomAccessFile

อิธิ�บายการใช้*อิ�นเตอิร�เฟสท์�%ช้0%อิ Serializable

อิธิ�บายวั�ธิ�การเข�ยนและอิ�านข*อิม.ลขอิงอิอิปเจ(คผ่�านstream

Stream

เปร�ยบเสม0อินท์�อิส�งข*อิม.ลจากต*นท์าง (source) ไปย�งปลายท์าง (sink)

stream ช้�วัยท์&าให*ผ่.*เข�ยนโปรแกรม ไม�จ&าเป3นต*อิงท์ราบรายละเอิ�ยดการต�ดต�อิก�บฮาร�ดแวัร�หร0อิซอิฟต�แวัร�

ท์�%ใช้*ในการส�งข*อิม.ล เพุ�ยงแต�ต*อิงร.*เมธิอิดท์�%ใช้*ในการร�บหร0อิส�งข*อิม.ล

source เป3นต&าแหน�งเร�%มต*นขอิง stream เร�ยกวั�าinput stream

sink เป3นต&าแหน�งส�6นสดขอิง stream เร�ยกวั�าoutput stream

Stream

source หร0อิ sink อิาจเป3นฮาร�ดแวัร�หร0อิซอิฟต�แวัร� เช้�น ไฟล� หน�วัยควัามจ&า หร0อิ socket เป3นต*น

ภาษาจาวัาแบ�ง stream อิอิกเป3น•byte stream• character stream

ค&าวั�า stream โดยท์�%วัไปจะหมายถุ8ง byte stream reader และ writer จะหมายถุ8ง character

stream

แพุคเก(จ java.io

คลาสท์�%เก�%ยวัก�บอิ�นพุตและเอิาท์�พุต จะถุ.กก&าหนดโดย Java API ในแพุคเก(จ java.io ซ8%งจะม�คลาสพุ06นฐานอิย.� 4 คลาสค0อิ • InputStream

เป3นคลาสท์�%ใช้*ในการสร*างอิอิปเจ(คท์�%เป3น stream ในการร�บช้น�ด ข*อิม.ลแบบ byte

• OutputStream เป3นคลาสท์�%ใช้*ในการสร*างอิอิปเจ(คท์�%เป3น stream ในการส�งช้น�ด

ข*อิม.ลแบบ byte

• Reader เป3นคลาสท์�%ใช้*ในการสร*างอิอิปเจ(คท์�%เป3น stream ในการร�บช้น�ด

ข*อิม.ลแบบ char

• Writer เป3นคลาสท์�%ใช้*ในการสร*างอิอิปเจ(คท์�%เป3น stream ในการส�งช้น�ด

ข*อิม.ลแบบ char

คลาสประเภท์ InputStream

คลาสประเภท์ OutputStream

คลาสประเภท์ Reader

คลาสประเภท์ Writer

คลาสประเภท์ Byte Stream

ภาษาจาวัาจะม�คลาสพุ06นฐานในการจ�ดการก�บอิ�นพุตและ เอิาท์�พุตท์�%เป3นช้น�ดข*อิม.ลแบบ byte อิย.�สอิงคลาสท์�%ค.�ก�น

ค0อิ InputStream และ OutputStream คลาสท์�6งสอิงเป3นคลาสแบบ abstract ซ8%งเราไม�สามารถุ

ท์�%จะสร*างอิอิปเจ(คขอิงคลาสท์�6งสอิงได* แต�คลาสท์�6งสอิง จะม�คลาสท์�%เป3น subclass ซ8%งจะใช้*ในการสร*างอิอิป

เจ(คส&าหร�บการร�บและส�งข*อิม.ลแบบ byte ขอิงโหนดท์�%ม�ต*นท์างและปลายท์างแบบต�างๆอิาท์�เช้�น• FileInputStream และ FileOutputStream เป3นคลาสท์�%ใช้*ในการ

สร*าง อิอิปเจ(คส&าหร�บต*นท์างและปลายท์างท์�%เป3นไฟล�• ByteArrayInputStream และ ByteArrayOutputStream เป3น

คลาสท์�%ใช้*ในการสร*างอิอิปเจ(คส&าหร�บต*นท์างและปลายท์าง ท์�% เป3นอิะเรย�ขอิงช้น�ดข*อิม.ลแบบ byte

คลาส InputStream คลาส InputStream จะใช้*ในการอิ�านข*อิม.ลขอิง stream

ท์�%เป3นช้น�ดข*อิม.ลแบบ byte คลาส InputStream จะน&าข*อิม.ลจากโหนดต*นท์างเข*ามาใน

stream และการอิ�านข*อิม.ลจาก stream จะเป3นการ ลบข*อิม.ลท์�%อิ�านอิอิกจาก stream โดยม�เมธิอิดท์�%ใช้*

ส&าหร�บการอิ�านข*อิม.ลท์�%เป3น byte หร0อิอิะเรย�ขอิง byte เท์�าน�6นด�งน�6 • int read()• int read(byte []b)• int read(byte []b,int offset,int length)

คลาส InputStream

เมธิอิดอิ0%นๆท์�%ส&าค�ญ• void close()• int available()• void skip(long n)• boolean markSupported()• void mark(int readlimit)• void reset()

คลาส OutputStream คลาส OutputStream จะใช้*การส�งข*อิม.ลขอิง stream

ท์�%เป3นช้น�ดข*อิม.ลแบบ byte การส�งข*อิม.ลขอิงอิอิบเจ(คช้ น�ด Outputstream จะเป3นการเพุ�%มข*อิม.ลลงใน stream

คลาส OutputStream จะม�เมธิอิดในการส�งข*อิม.ลช้น�ดbyte ท์�%สอิดคล*อิงก�บเมธิอิด read() ในคลาส InputStream

โดยคลาสน�6จะม�เมธิอิด write() ท์�%เป3นเมธิอิดแบบabstract ในร.ปแบบต�างๆด�งน�6 • void write(int c)• void write(byte []b)• void write(byte []b,int offset,int length)

คลาส OutputStream

เมธิอิดอิ0%นๆท์�%ส&าค�ญ• void close()• void flush()

คลาสประเภท์ Character Stream

ภาษาจาวัาก&าหนดคลาสพุ06นฐานในการจ�ดการก�บอิ�นพุต และเอิาท์�พุตท์�%เป3นช้น�ดข*อิม.ลแบบ char อิย.�สอิงคลาสค0อิ

Reader และ Writer คลาสท์�6งสอิงเป3นคลาสแบบ abstract โดยม�

subclass ท์�%ส0บท์อิดมาเพุ0%อิใช้*ในการสร*างอิอิปเจ(คส&าหร�บจ�ดการก�บโหนดต*นท์างและปลายท์างในร.ปแบบ

ต�างๆเช้�น ไฟล� หน�วัยควัามจ&า และไบท์� เป3นต*น

คลาส Reader Reader เป3นคลาสท์�%ใช้*ในการอิ�านข*อิม.ลขอิง stream ท์�%

เป3นช้น�ดข*อิม.ลแบบ char Reader จะม�เมธิอิดท์�%เหม0อินก�บคลาส InputStream และม�

หล�กการท์&างานท์�%สอิดคล*อิงก�นแต�จะร�บข*อิม.ลหร0อิargument ท์�%เป3นช้น�ดข*อิม.ล char โดยม�เมธิอิดต�างๆด�งน�6• int read()• int read(char []c)• int read(char []c,int offset,int length)• void close()• boolean ready()• void skip(long n)• boolean markSupported()• void mark(int readAheadlimit)• void reset()

คลาส Writer Writer เป3นคลาสท์�%ใช้*ในการเข�ยนข*อิม.ลขอิง stream

ท์�%เป3นช้น�ดข*อิม.ลแบบ char Writer จะม�เมธิอิดท์�%เหม0อินก�บคลาส OutputStream และม�

หล�กการท์�สอิดคล*อิงก�นแต�จะร�บข*อิม.ลหร0อิargument ท์�%เป3นช้น�ดข*อิม.ล char โดยม�เมธิอิดต�างๆด�งน�6 • void write(int c)• void write(char []c)• void write(char []c,int offset,int length)• void close()• void flush()

เมธิอิดเพุ�%มเต�มเพุ0%อิเข�ยนช้น�ดข*อิม.ลท์�%เป3น String• void write(String s)• void write(String s,int offset,int length)

โหนดส&าหร�บ Stream

ภาษาจาวัาก&าหนดโหนดท์�%เป3นต*นท์างและปลายท์างขอิงstream ไวั*สามแบบค0อิ ไฟล� หน�วัยควัามจ&า และไปป9(pipe)

ไฟล�ค0อิโหนดส&าหร�บ stream ท์�%เป3นไฟล�ส&าหร�บอิ�าน หร0อิเข�ยนข*อิม.ลช้น�ด byte

หน�วัยควัามจ&าค0อิโหนดส&าหร�บ stream ท์�%ใช้*ส&าหร�บ อิ�านหร0อิเข�ยนข*อิม.ลท์�%เป3นอิะเรย�หร0อิ String

ไปป9ค0อิโหนดส&าหร�บ stream ท์�%จะส�งหร0อิร�บข*อิม.ล ระหวั�าง process หร0อิโปรแกรมเธิรด

คลาสท์�%เป3น โหนดส&าหร�บ stream ต�างๆ

ช้น�ด Byte Stream Character Stream

FileFileInputStream

FileOutputStream

FileReader

FileWriter

Memory: ArrayByteArrayInputStream

ByteArrayOutputStream

CharArrayReader

CharArrayWriter

Memory: String -StringReader

StringWriter

PipePipedInputStream

PipedOutputStream

PipedReader

PipedWriter

ต�วัอิย�างโปรแกรม FileCopy.javaimport java.io.*;

public class FileCopy { public static void main(String args[]) { try {

FileInputStream fin = new FileInputStream(args[0]);

FileOutputStream fout = new FileOutputStream(args[1]);

byte b[] = new byte[100];int i = fin.read(b);while (i != -1) {

fout.write(b,0,i); i = fin.read(b);

}fin.close();fout.close();

} catch (IOException e) { } }}

import java.io.*;

public class FileCopy { public static void main(String args[]) { try {

FileInputStream fin = new FileInputStream(args[0]);

FileOutputStream fout = new FileOutputStream(args[1]);

byte b[] = new byte[100];int i = fin.read(b);while (i != -1) {

fout.write(b,0,i); i = fin.read(b);

}fin.close();fout.close();

} catch (IOException e) { } }}

ต�วัอิย�างโปรแกรม FileCopyReader.javaimport java.io.*;

public class FileCopyReader { public static void main(String args[]) {

try { FileReader fr = new FileReader(args[0]); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter(args[1]); BufferedWriter bw = new BufferedWriter(fw); String line = br.readLine(); while (line != null) {

bw.write(line,0,line.length());bw.newLine();line = br.readLine();

} br.close(); bw.close();} catch (IOException e) { }

}}

import java.io.*;

public class FileCopyReader { public static void main(String args[]) {

try { FileReader fr = new FileReader(args[0]); BufferedReader br = new BufferedReader(fr); FileWriter fw = new FileWriter(args[1]); BufferedWriter bw = new BufferedWriter(fw); String line = br.readLine(); while (line != null) {

bw.write(line,0,line.length());bw.newLine();line = br.readLine();

} br.close(); bw.close();} catch (IOException e) { }

}}

อิธิ�บายต�วัอิย�างโปรแกรม โปรแกรม FileCopy.java แสดงต�วัอิย�างขอิงการก(อิบป:6

ข*อิม.ลขอิงไฟล�หน8%งไฟล�ไปย�งไฟล�อิ0%น โดยใช้* byte stream

โปรแกรม FileCopyReader.java แสดงต�วัอิย�างขอิง ก(อิปป:6 ข*อิม.ลขอิงไฟล�เช้�นเด�ยวัก�บโปรแกรม

FileCopy.java แต�จะใช้* character stream

การเช้0%อิมต�อิอิอิปเจ(คขอิงคลาส โดยท์�%วัไปโปรแกรมภาษาจาวัาจะใช้*อิอิปเจ(คประเภท์

stream มากกวั�าหน8%งอิอิปเจ(คโดยจะเช้0%อิมอิอิปเจ(ค ขอิง stream ต�างๆเข*าด*วัยก�นเพุ0%อิใช้*ในการแปลง

ช้น�ดข*อิม.ลประเภท์ต�างๆ

ต�วัอิย�างแสดงการเช้0%อิมต�อิอิอิปเจ(คขอิงคลาส FileInputStream ท์�%อิ�านข*อิม.ลเข*ามาโดยม�ช้น�ดข*อิม.ล เป3นbyte เข*าก�บอิอิปเจ(คขอิงคลาส DataInputStream เพุ0%อิใช้*อิ�านข*อิม.ลช้น�ดอิ0%นๆได*มากข86น เช้�น

FileInputStream fin = new FileInputStream(“test.dat”);DataInputStream din = new DataInputStream(fin);

คลาสประเภท์ stream ระด�บส.ง อิอิปเจ(คท์�%ใช้*ในการเช้0%อิมต�อิ stream จะเป3นอิอิปเจ(ค

ขอิงคลาสประเภท์ steam ระด�บส.ง (high-level stream) ซ8%งสามารถุท์�%จะอิ�านหร0อิเข�ยนข*อิม.ลท์�%เป3น

ช้น�ดข*อิม.ลอิ0%นๆแล*วัแปลงข*อิม.ลให*เป3นช้น�ดข*อิม.ลแบบbyte หร0อิม�บ�ฟเฟอิร�ในการเพุ�%มประส�ท์ธิ�ภาพุในการอิ�าน

หร0อิเข�ยนข*อิม.ล คลาสเหล�าน�6จะไม�สามารถุอิ�านหร0อิเข�ยนข*อิม.ลไปย�ง

โหนดต*นท์างหร0อิปลายท์างท์�%เป3นไฟล� หน�วัยควัามจ&า หร0อิ Pipe ได*โดยตรง แต�จะร�บข*อิม.ลมาจาก stream

อิ0%นๆท์�%เป3นคลาสพุ06นฐานในการอิ�านหร0อิเข�ยนข*อิม.ล

คลาสประเภท์ stream ระด�บส.งท์�%ส&าค�ญ

DataInputStream และ DataOutputStream • เป3นคลาสท์�%ใช้*ในการแปลงช้น�ดข*อิม.ลระหวั�างช้น�ดข*อิม.ลแบบbyte ก�บช้น�ดข*อิม.ลแบบอิ0%นๆ

BufferedInputStream และ BufferedOutputStream • เป3นคลาสท์�%ม�บ�ฟเฟอิร�ส&าหร�บช้น�ดข*อิม.ล byte อิย.�ภายในเพุ0%อิให*

สามารถุอิ�านหร0อิเข�ยนข*อิม.ลขนาดใหญ� ซ8%งจะช้�วัยเพุ�%มประส�ท์ธิ�ภาพุในการอิ�านหร0อิเข�ยนข*อิม.ล

PrintStream• เป3นคลาสท์�%ใช้*ในการเข�ยนข*อิควัามท์�%เป3น String ท์�%แปลงมาจาก

ช้น�ดข*อิม.ลแบบ byte อิอิปเจ(คท์�%ช้0%อิ out และ err ท์�%อิย.�ในคลาสท์�% ช้0%อิ System เป3นต�วัอิย�างขอิงอิอิปเจ(คท์�%ใช้*คลาสน�6

PushbackInputStream• คลาสน�6อินญาตให*ส�งข*อิม.ลช้น�ด byte ท์�%เพุ�%งอิ�านมากล�บไปย�งstream ได*

คลาสประเภท์ stream ระด�บส.งท์�%ส&าค�ญ

ButteredReader และ BufferedWriter• เป3นคลาสท์�%ม�บ�ฟเฟอิร�ส&าหร�บช้น�ดข*อิม.ลแบบ char เพุ0%อิให*

สามารถุอิ�านหร0อิเข�ยนข*อิม.ลข*อิใหญ�ได* InputStreamReader และ OutputStreamWriter

• เป3นคลาสท์�%ใช้*ในการแปลงช้น�ดข*อิม.ลระหวั�างช้น�ดข*อิม.ลแบบchar ก�บช้น�ดข*อิม.ลแบบอิ0%นๆ

PrintWriter• เป3นคลาสท์�%ใช้*ในการเข�ยนข*อิควัามท์�%เป3น String ท์�%แปลงมา

จากช้น�ดข*อิม.ลแบบ char

PushbackReader• เป3นคลาสท์�%อินญาตให*ส�งข*อิม.ลช้น�ด char ท์�%เพุ�%งอิ�านมากล�บไป

ย�ง stream ได*

คลาสประเภท์ stream ระด�บส.ง

ช้น�ด Byte Stream Character Stream

BufferingBufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter

FilteringFilterInputStream

FilterOutputStream

FilterReader

FilterWriter

Data

conversion

DataInputStream

DataOutputStream-

Printing PrintStream PrintWriter

Peeking ahead PushbackInputStream PushbackReader

การเช้0%อิมต�อิ Stream หลายช้�6น เราสามารถุเช้0%อิมต�อิ Stream ได*หลายช้�6น เช้�น

FileInputStream f = new FileInputStream(“text.dat”);BufferedInputStream b = new BufferedInputStream(f);DataInputStream d = new DataInputStream(b);

คลาส DataInputStream

คลาส DataInputStream ม�เมธิอิดในการอิ�านข*อิม.ลช้น�ดต�างๆด�งน�6• boolean readBoolean()• byte readByte()• char readChar()• double readDouble()• float readFloat()• int readInt()• long readLong()• short readShort()• String readUTF()

คลาส DataOutputStream

DateOutputStream เป3น high-level FilterStream ซ8%งม�เมธิอิดในการเข�ยนข*อิม.ลช้น�ดต�างๆด�งน�6• void writeBoolean(boolean b)• void writeByte(int b)• void writeByte(String s)• void writeChar(int c)• void writeDouble(double d)• void writeFloat(float f)• void writeInt(int i)• void writeLong(long l)• void writeShort(int s)• void writeUTF(String s)

ต�วัอิย�าง ขอิงการใช้*คลาสDataOutputStream

import java.io.*;

public class DataWriterDemo {public static void main (String args[]) {

try {FileOutputStream fout;DataOutputStream dout;fout = new FileOutputStream("data.dat");dout = new DataOutputStream(fout);dout.writeInt(124);dout.writeDouble(2.45);dout.writeChar('a');dout.writeUTF("test");dout.close();fout.close();

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

import java.io.*;

public class DataWriterDemo {public static void main (String args[]) {

try {FileOutputStream fout;DataOutputStream dout;fout = new FileOutputStream("data.dat");dout = new DataOutputStream(fout);dout.writeInt(124);dout.writeDouble(2.45);dout.writeChar('a');dout.writeUTF("test");dout.close();fout.close();

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

ต�วัอิย�างโปรแกรม DataInputStreamimport java.io.*;

public class DataReaderDemo {public static void main (String args[]) {

try {FileInputStream fin;DataInputStream din;fin = new FileInputStream("data.dat");din = new DataInputStream(fin);int x = din.readInt();double d = din.readDouble();char ch = din.readChar();String line = din.readUTF();

System.out.println("x= " + x + " d= "+ d + " ch= " + ch);

System.out.println(line);

import java.io.*;

public class DataReaderDemo {public static void main (String args[]) {

try {FileInputStream fin;DataInputStream din;fin = new FileInputStream("data.dat");din = new DataInputStream(fin);int x = din.readInt();double d = din.readDouble();char ch = din.readChar();String line = din.readUTF();

System.out.println("x= " + x + " d= "+ d + " ch= " + ch);

System.out.println(line);

ต�วัอิย�างโปรแกรม DataInputStream

din.close();fin.close();

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

din.close();fin.close();

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

ผ่ลล�พุธิ�ท์�%ได*จากการร�นโปรแกรมx= 124 d= 2.45 ch= atest

การแปลงข*อิม.ลระหวั�าง byte และ char

เราสามารถุท์�%จะแปลง stream ระหวั�างช้น�ดข*อิม.ลแบบbyte และช้น�ดข*อิม.ลแบบ char ได*โดยใช้*• คลาส InputStreamReader ซ8%งจะอิ�านช้น�ดข*อิม.ลแบบ byte แล*วั

แปลงเป3นช้น�ดข*อิม.ลแบบ char • คลาส OutputStreamWriter ซ8%งจะอิ�านช้น�ดข*อิม.ลแบบ char

แล*วัแปลงเป3นช้น�ดข*อิม.ลแบบ byte

ต�วัอิย�างโปรแกรมimport java.io.*;

public class FileWriter {public static void main(String args[]) {

FileOutputStream fout;OutputStreamWriter oout;PrintWriter p;String line1 = "This is a test message";String line2 = "This is another line";try {

fout = new FileOutputStream("data.dat");

oout = new OutputStreamWriter(fout);p = new PrintWriter(oout);p.println(line1);p.println(line2);

import java.io.*;

public class FileWriter {public static void main(String args[]) {

FileOutputStream fout;OutputStreamWriter oout;PrintWriter p;String line1 = "This is a test message";String line2 = "This is another line";try {

fout = new FileOutputStream("data.dat");

oout = new OutputStreamWriter(fout);p = new PrintWriter(oout);p.println(line1);p.println(line2);

ต�วัอิย�างโปรแกรมp.close();oout.close();fout.close();

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

p.close();oout.close();fout.close();

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

คลาส File

คลาสท์�%ช้0%อิ File เป3นคลาสท์�%อิย.�ในแพุคเก(จ java.io เป3น คลาสท์�%ใช้*ในการสร*างอิอิปเจ(คท์�%เป3นไฟล�หร0อิไดเร(กท์อิร�%

คลาส File จะม�เมธิอิดในการจ�ดการก�บไฟล�หร0อิ ไดเร(กท์อิร�% และเมธิอิดในการส0บค*นข*อิม.ลต�างๆอิย.�หลาย

เมธิอิด อิอิปเจ(คขอิงคลาส File จะสร*างมาจาก

constructor ท์�%ม�ร.ปแบบด�งน�6• public File(String name)• public File(String dir, String name)• public File(File dir, String name)

เมธิอิดขอิงคลาส File

เมธิอิดขอิงคลาส File ท์�%ใช้*ในการส0บค*นข*อิม.ลหร0อิจ�ดการก�บไฟล�ท์�%ส&าค�ญม�ด�งน�6 • boolean exists()• boolean isFile()• boolean isDirectory()• String getName()• String getParent()• String []list()• boolean canWrite()• boolean mkdir()• boolean renameTo(File newName)

การ สร*างอิอิปเจ(คขอิงคลาส File

เราสามารถุสร*างอิอิปเจ(คช้น�ดคลาส File เพุ0%อิตรวัจสอิบวั�าม�ไฟล�ด�งกล�าวัหร0อิไม�

Constructor ขอิงFileInputStream/FileOutputStream หร0อิFileReader/FileWriter ม� argument ท์�%เป3นอิอิปเจ(คช้น�ดคลาส File

ต�วัอิย�างFile f = new File(“test.dat”);

if (f.exists()) {

FileInputStream fir = new FileInputStream(f);

}

คลาส RandomAccessFile

ภาษาจาวัาม�คลาสท์�%สน�บสนนการอิ�านหร0อิเข�ยนไฟล�เป3น แบบ random access กล�าวัค0อิไม�จ&าเป3นจะต*อิงอิ�าน

หร0อิเข�ยนข*อิม.ลขอิงไฟล�เร�ยงตามล&าด�บจากต&าแหน�ง แรกสดไปย�งต&าแหน�งสดท์*ายขอิงไฟล� คลาสประเภท์น�6

ค0อิคลาส RandomAccessFile ซ8%งจะใช้*เวัลาในการอิ�านหร0อิ เข�ยนข*อิม.ลในต&าแหน�งต�างๆเท์�าก�น

คลาส RandomAccessFile จะม� constructor อิย.�สอิงร.ปแบบด�งน�6 • public RandomAccessFile(String name,String mode)• public RandomAccessFile(File file,String mode)mode อิาจก&าหนดเป3น

• “r” เป(นการเป;ดไฟล�เพุ0%อิอิ�านข*อิม.ล• “rw” เป(นการเป;ดไฟล�เพุ0%อิอิ�านและเข�ยนข*อิม.ล

เมธิอิดขอิงคลาส RandomAccessFile

คลาส RandomAccessFile จะม�เมธิอิดส&าหร�บการอิ�านและเข�ยนข*อิม.ล

ท์�%เป3นช้น�ดข*อิม.ลแบบพุ06นฐานช้น�ดต�างๆคล*ายก�บคลาสDataInputStream และ DataOutputStream

คลาส RandomAccessFile ม�เมธิอิดอิ0%นๆท์�%ส&าค�ญเพุ�%มเต�มมาด�งน�6• long getFilePointer()• long length()• void seek(long pos)

ObjectStream

ภาษาจาวัาม�คลาสท์�%ใช้*ในการร�บและส�งข*อิม.ลขอิงอิอิปเจ(คท์�%ช้0%อิ• ObjectInputStream• ObjectOutputStream

ท์�6งน�6อิอิปเจ(คท์�%จะสามารถุส�งผ่�าน stream เหล�าน�6ได*จะ ต*อิงเป3นอิอิปเจ(คขอิงคลาสท์�% implements อิ�นเตอิร�เฟส

Serializable ซ8%งเป3นอิ�นเตอิร�เฟสในแพุคเก(จ java.io

อิอิปเจ(คบางประเภท์จะไม�สามารถุท์�%จะ implements อิ�นเตอิร�เฟส Serializable ได* เน0%อิงจากข*อิม.ลขอิงอิอิป

เจ(คอิาจเปล�%ยนแปลงได*ตลอิดเวัลา อิาท์�เช้�น อิอิปเจ(ค ขอิงคลาส Thread หร0อิ FileInputStream

ObjectStream เราสามารถุจะระบคณล�กษณะขอิงอิอิปเจ(คหร0อิคณล�กษณะขอิง

คลาสท์�%ไม�ต*อิงการจะเก(บหร0อิเร�ยกด.ข*อิม.ลผ่�าน stream ได*โดย การระบให*คณล�กษณะด�งกล�าวัม� modifier เป3นค�ย�เวั�ร�ดท์�%ช้0%อิ

transient ต�วัอิย�างเช้�นpublic class Student implements Serializable { private String id,name;

private double gpa;private transient String parent; }

คลาส ObjectOutputStream เป3นคลาสท์�%ใช้*ในการเข�ยนอิอิปเจ(ค ใดๆลงใน stream โดยม�เมธิอิด writeObject()ท์�%ใช้*ในการเข�ยน

ข*อิม.ล ส�วันคลาส ObjectInputStream เป3นคลาสท์�%ใช้*ในการร�บอิอิปเจ(ค

ใดๆมาจาก stream โดยม�เมธิอิด readObject() ท์�%ใช้*ในการอิ�านข*อิม.ล

ต�วัอิย�างโปรแกรมimport java.io.*;

public class ObjectPersistenceDemo {public static void main(String args[]) {

Student s = new Student("Somchai", "4514452-2", 3.21);

FileOutputStream fout;ObjectOutputStream oout;FileInputStream fin;ObjectInputStream oin;try {

fout = new FileOutputStream("data.dat");oout = new ObjectOutputStream(fout);oout.writeObject(s);System.out.println("Write to file

successfully");oout.close();fout.close();

import java.io.*;

public class ObjectPersistenceDemo {public static void main(String args[]) {

Student s = new Student("Somchai", "4514452-2", 3.21);

FileOutputStream fout;ObjectOutputStream oout;FileInputStream fin;ObjectInputStream oin;try {

fout = new FileOutputStream("data.dat");oout = new ObjectOutputStream(fout);oout.writeObject(s);System.out.println("Write to file

successfully");oout.close();fout.close();

ต�วัอิย�างโปรแกรมfin = new FileInputStream("data.dat");oin = new ObjectInputStream(fin);Student s2 = (Student) oin.readObject();oin.close();fin.close();s2.showAllDetails();

} catch (ClassNotFoundException ex) {System.out.println(ex.toString());

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

fin = new FileInputStream("data.dat");oin = new ObjectInputStream(fin);Student s2 = (Student) oin.readObject();oin.close();fin.close();s2.showAllDetails();

} catch (ClassNotFoundException ex) {System.out.println(ex.toString());

} catch (IOException ex) {System.out.println(ex.toString());

}}

}

ผ่ลล�พุธิ�ท์�%ได*จากการร�นโปรแกรมWrite to file successfullyID: 4514452-2Name: SomchaiGPA: 3.21

สรปเน06อิหาขอิงบท์ stream เปร�ยบเสม0อินท์�อิส�งข*อิม.ล สามารถุแบ�งอิอิก

ได*เป3น 2 ประเภท์ค0อิ byte stream และcharacter stream

byte stream ม�คลาสพุ06นฐานค0อิ คลาส InputStream และ OutputStream

character stream ม�คลาสพุ06นฐานค0อิ คลาสReader และ Writer

คลาส InputStream จะใช้*ในการอิ�านข*อิม.ลขอิง stream และ OutputStream จะน&าข*อิม.ลจากโหนดต*นท์างเข*ามาใน

stream ส&าหร�บข*อิม.ลท์�%ม�ช้น�ดข*อิม.ลเป3นแบบ byte

สรปเน06อิหาขอิงบท์ คลาส Reader เป3นคลาสท์�%ใช้*ในการอิ�านข*อิม.ลขอิง

stream และคลาสWriter เป3นคลาสท์�%ใช้*ในการเข�ยน ข*อิม.ลขอิง stream ส&าหร�บข*อิม.ลท์�%ม�ช้น�ดข*อิม.ลเป3น

แบบ char

คลาสประเภท์ stream ระด�บส.งท์�%ส&าค�ญค0อิ คลาสDataInputStream, DataOutputStream, BufferedInputStream, BufferedOutputStream, PrintStream, PushbackInputStream, BufferedReader, BufferedWriter, InputStreamReader,

OutputStreamWriter, PrintWriter และ PushbackReader

การเช้0%อิมต�อิ stream หลายช้�6น จะท์&าให*สามารถุเร�ยกใช้*เมธิอิดได*หลายร.ปแบบตามควัามต*อิงการในการใช้*งาน

สรปเน06อิหาขอิงบท์ คลาส File ใช้*ในการสร*างอิอิปเจ(คขอิงไฟล�หร0อิ

ไดเร(กท์อิร�% โดยจะม�เมธิอิดท์�%ใช้*ในการจ�ดการก�บไฟล� คลาส RandomAccessFile จะม�ร.ปแบบในการอิ�านและ

เข�ยนข*อิม.ลเป3นแบบ random access อิอิปเจ(คท์�%จะสามารถุร�บหร0อิส�งผ่�าน stream ได*จะต*อิง

เป3นอิอิปเจ(คขอิงคลาสท์�% implements อิ�นเตอิร�เฟสSerializable

แบบฝึ>กห�ด ข*อิท์�% 1

• จากโปรแกรมจ&าลอิงระบบธินาคาร ให*ท์ดลอิงเข�ยนโปรแกรม เพุ0%อิเก(บข*อิม.ลต�างๆลงไฟล� และสามารถุเร�ยกกล�บมาใช้*งานได*

อิย�างถุ.กต*อิง