บทท 10
         คลาสอนพตและเอาทพต
         (Input/Output Classes)

           ผศ.ธนศา เครอไวศยวรรณ
           คณะเทคโนโลย(สารสนเทศ
สถาบ,นเทคโนโลย(พระจอมเกล1าเจ1าค2ณทหารลาดกระบ,ง
ว,ตถ2ประสงค8
 อธบายความหมายและประเภทของ stream
 อธบายองค8ประกอบท(ส>าค,ญของแพคเก@จ java.io
                   =
 แนะน>าคลาสและเมธอดของคลาส InputStream และ OutputStream
 แนะน>าคลาสและเมธอดของคลาส Reader และ Writer

 อธบายความแตกตAางระหวAางคลาส Reader และ Writer ก,บ stream

 อธบายการสร1างและใช1 stream แบบตAางๆ
ว,ตถ2ประสงค8
 แนะน>าคลาสและเมธอดของคลาส File
 อธบายการอAาน เข(ยนและอ,พเดทข1อมEลของคลาส RandomAccessFile
 อธบายการใช1อนเตอร8เฟสท(=ช=อ Serializable

 อธบายวธ(การเข(ยนและอAานข1อมEลของออปเจ@คผAาน stream
Stream
 เปรยบเสมอนทอสงขอมลจากตนทาง (source) ไปยงปลายทาง (sink)

 streamชวยท"าใหผเขยนโปรแกรม ไมจ"าเป(นตองทราบรายละเอยดการ
  ตดตอกบฮารดแวรหรอซอฟตแวรทใชในการสงขอมล เพยงแตตองรเมธอดท
  ใชในการรบหรอสงขอมล
 source เป(นต"าแหนงเรมตนของ    stream เรยกวา input stream
 sink เป(นต"าแหนงส/นสดของ   stream เรยกวา output stream
Stream
 source หรอ sink อาจเป(นฮารดแวรหรอซอฟตแวร เชน ไฟล หนวยความจ"า
  หรอ socket เป(นตน
 ภาษาจาวาแบง stream ออกเป(น
   •   byte stream
   •   character stream
 ค"าวา stream โดยทวไปจะหมายถ3ง    byte stream
 reader และ writer จะหมายถ3ง   character stream
แพคเก4จ java.io
 คลาสทเกยวกบอนพตและเอาทพตจะถEกก>าหนดโดย Java API ในแพคเก4จ
  java.io       ซV=งจะม(คลาสพWนฐานอยEA 4 คลาสคอ
   •   InputStream
       เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการร,บชนดข1อมEลแบบ byte
                                        =
   •   OutputStream
       เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการสAงชนดข1อมEลแบบ byte
                                        =
   •   Reader
       เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการร,บชนดข1อมEลแบบ char
                                        =
   •   Writer
       เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการสAงชนดข1อมEลแบบ char
                                        =
คลาสประเภท InputStream
คลาสประเภท OutputStream
คลาสประเภท Reader
คลาสประเภท Writer
คลาสประเภท Byte Stream
 ภาษาจาวาจะม(คลาสพนฐานในการจ,ดการก,บอนพ2ตและเอาท8พ2ตท(=เปZนชนด
                   W
  ข1อมEลแบบ byte อยEสองคลาสท(=คEAก,นคอ InputStream และ
                    A
  OutputStream
 คลาสท,WงสองเปZนคลาสแบบ abstract      ซV=งเราไมAสามารถท(=จะสร1างออปเจ@ค
  ของคลาสท,งสองได1 แตAคลาสท,Wงสองจะม(คลาสท(=เปZน subclass ซV=งจะใช1ใน
            W
  การสร1างออปเจ@คส>าหร,บการร,บและสAงข1อมEลแบบ byte ของโหนดท(=ม(
  ต1นทางและปลายทางแบบตAางๆอาทเชAน
   •   FileInputStream และ FileOutputStream เปZนคลาสท(=ใช1ในการสร1าง
       ออปเจ@คส>าหร,บต1นทางและปลายทางท(=เปZนไฟล8
   •   ByteArrayInputStream และ ByteArrayOutputStream เปZนคลาสท(=ใช1
       ในการสร1างออปเจ@คส>าหร,บต1นทางและปลายทาง ท(=เปZนอะเรย8ของชนดข1อมEลแบบ
       byte
คลาส InputStream
 คลาส InputStream    จะใช1ในการอAานข1อมEลของ stream ท(=เปZนชนดข1อมEล
  แบบ byte
 คลาส InputStream จะน>าข1อมEลจากโหนดต1นทางเข1ามาใน stream และ
  การอAานข1อมEลจาก stream จะเปZนการลบข1อมEลท(อAานออกจาก stream โดย
                                                =
  ม(เมธอดท(ใช1ส>าหร,บการอAานข1อมEลท(=เปZน byte หรออะเรย8ของ byte
            =
  เทAาน,นด,งน(W
        W
   •   int read()
   •   int read(byte []b)
   •   int read(byte []b,int offset,int length)
คลาส InputStream




 เมธอดอนๆท(ส>าค,ญ
            =
   •   void close()
   •   int available()
   •   void skip(long n)
   •   boolean markSupported()
   •   void mark(int readlimit)
   •   void reset()
คลาส OutputStream
 คลาส OutputStream    จะใช1การสAงข1อมEลของ stream ท(=เปZนชนดข1อมEล
  แบบ byte การสAงข1อมEลของออบเจ@คชนด Outputstream จะเปZนการเพ=ม
  ข1อมEลลงใน stream
 คลาส OutputStream จะม(เมธอดในการสAงข1อมEลชนด byte ท(=สอดคล1อง
  ก,บเมธอด read() ในคลาส InputStream โดยคลาสน(Wจะม(เมธอด
  write() ท(เปZนเมธอดแบบ abstract ในรEปแบบตAางๆด,งน(W
            =
   •   void write(int c)
   •   void write(byte []b)
   •   void write(byte []b,int offset,int length)
คลาส OutputStream




 เมธอดอนๆท(ส>าค,ญ
            =
   •   void close()
   •   void flush()
คลาสประเภท Character Stream
 ภาษาจาวาก>าหนดคลาสพนฐานในการจ,ดการก,บอนพ2ตและเอาท8พตท(เปZน
                     W                               2 =
  ชนดข1อมEลแบบ char อยEAสองคลาสคอ Reader และ Writer
 คลาสท,WงสองเปZนคลาสแบบ abstract โดยม( subclass ท(=สบทอดมาเพอใช1
                                                             =
  ในการสร1างออปเจ@คส>าหร,บจ,ดการก,บโหนดต1นทางและปลายทางในรEปแบบ
  ตAางๆเชAน ไฟล8 หนAวยความจ>า และไบท8 เปZนต1น
คลาส Reader
   Reader   เป(นคลาสทใชในการอานขอมลของ stream ทเป(นชนดขอมลแบบ
    char
   Reader จะมเมธอดทเหมอนกบคลาส InputStream และมหลกการ
    ท"างานทสอดคลองกนแตจะรบขอมลหรอ argument ทเป(นชนดขอมล char
    โดยมเมธอดตางๆดงน/
     •   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      เป(นคลาสทใชในการเขยนขอมลของ stream ทเป(นชนดขอมลแบบ
    char
   Writer จะมเมธอดทเหมอนกบคลาส OutputStream และมหลกการท
    สอดคลองกนแตจะรบขอมลหรอ argument ทเป(นชนดขอมล char โดยม
    เมธอดตางๆดงน/
     •   void   write(int c)
     •   void   write(char []c)
     •   void   write(char []c,int offset,int length)
     •   void   close()
     •   void   flush()
 เมธอดเพ=มเตมเพอเข(ยนชนดข1อมEลท(=เปZน String
                =
     •   void write(String s)
     •   void write(String s,int offset,int length)
โหนดส>าหร,บ Stream
 ภาษาจาวาก>าหนดโหนดท(เปZนต1นทางและปลายทางของ stream ไว1สามแบบ
                      =
  คอ ไฟล8 หนAวยความจ>า และไปป^ (pipe)
 ไฟล8คอโหนดส>าหร,บ stream ท(เปZนไฟล8ส>าหร,บอAานหรอเข(ยนข1อมEลชนด
                             =
  byte
 หนAวยความจ>าคอโหนดส>าหร,บ stream ท(=ใช1ส>าหร,บอAานหรอเข(ยนข1อมEลท(=
  เปZนอะเรย8หรอ String
 ไปป^คอโหนดส>าหร,บ stream ท(จะสAงหรอร,บข1อมEลระหวAาง process หรอ
                             =
  โปรแกรมเธรด
คลาสทเป(นโหนดส>าหร,บ stream ตAางๆ
    ชนด              Byte Stream         Character Stream
                   FileInputStream          FileReader
    File
                   FileOutputStream         FileWriter

                 ByteArrayInputStream    CharArrayReader
Memory: Array
                 ByteArrayOutputStream   CharArrayWriter

                                           StringReader
Memory: String            -
                                           StringWriter

                   PipedInputStream        PipedReader
    Pipe
                  PipedOutputStream        PipedWriter
ตวอยางโปรแกรม FileCopy.java
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.java
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        แสดงต,วอยAางของการก@อบป_`ข1อมEลของไฟล8
  หนVงไฟล8ไปย,งไฟล8อ=น โดยใช1 byte stream
     =
 โปรแกรม FileCopyReader.java แสดงต,วอยAางของก@อปป_`ขอมEลของ
                                                         1
  ไฟล8เชAนเด(ยวก,บโปรแกรม FileCopy.java แตAจะใช1 character stream
การเช=อมตAอออปเจ@คของคลาส
 โดยท,วไปโปรแกรมภาษาจาวาจะใช1ออปเจ@คประเภท stream มากกวAาหนVง
       =                                                     =
  ออปเจ@คโดยจะเช=อมออปเจ@คของ stream ตAางๆเข1าด1วยก,นเพ=อใช1ในการ
  แปลงชนดข1อมEลประเภทตAางๆ



 ตวอยางแสดงการเชอมตอออปเจ@คของคลาส FileInputStream ทอาน
  ขอมลเข1ามาโดยม(ชนดข1อมEลเป(น byte เขากบออปเจ@คของคลาส
  DataInputStream เพอใชอานขอมลชนดอนๆได1มากขVWนเชน
     FileInputStream fin = new FileInputStream(“test.dat”);
     DataInputStream din = new DataInputStream(fin);
คลาสประเภท stream ระด,บสEง
 ออปเจ@คท(ใช1ในการเช=อมตAอ stream จะเปZนออปเจ@คของคลาสประเภท
           =
  steam ระด,บสEง (high-level stream) ซV=งสามารถท(จะอAานหรอเข(ยนข1อมEลท(=
                                                 =
  เปZนชนดข1อมEลอ=นๆแล1วแปลงข1อมEลให1เปZนชนดข1อมEลแบบ byte หรอม(
  บ,ฟเฟอร8ในการเพ=มประสทธภาพในการอAานหรอเข(ยนข1อมEล
 คลาสเหลAาน(จะไมAสามารถอAานหรอเข(ยนข1อมEลไปย,งโหนดต1นทางหรอปลาย
             W
  ทางท(เปZนไฟล8 หนAวยความจ>า หรอ Pipe ได1โดยตรง แตAจะร,บข1อมEลมาจาก
       =
  stream อ=นๆท(=เปZนคลาสพนฐานในการอAานหรอเข(ยนข1อมEล
                         W
คลาสประเภท stream ระด,บสEงท(ส>าค,ญ
                                         =
   DataInputStream และ DataOutputStream
     •   เปZนคลาสท(=ใช1ในการแปลงชนดข1อมEลระหวAางชนดข1อมEลแบบ byte ก,บชนดข1อมEล
         แบบอ=นๆ
   BufferedInputStream           และ   BufferedOutputStream
     •   เปZนคลาสท(=ม(บ,ฟเฟอร8ส>าหร,บชนดข1อมEล byte อยEAภายในเพ=อให1สามารถอAานหรอ
         เข(ยนข1อมEลขนาดใหญA ซV=งจะชAวยเพ=มประสทธภาพในการอAานหรอเข(ยนข1อมEล
   PrintStream
     •   เปZนคลาสท(=ใช1ในการเข(ยนข1อความท(เปZน String ท(แปลงมาจากชนดข1อมEลแบบ
                                          =              =
         byte ออปเจ@คท(=ชอ out และ err ท(=อยEในคลาสท(=ชอ System เปZนต,วอยAางขอ
                          =                   A        =
         งออปเจ@คท(ใช1คลาสน(W
                   =
   PushbackInputStream
     •   คลาสน/อนญาตใหสงขอมลชนด byte ทเพงอานมากลบไปยง stream ได
คลาสประเภท stream ระด,บสEงท(ส>าค,ญ
                                         =
   ButteredReader และ BufferedWriter
     •   เปZนคลาสท(=ม(บ,ฟเฟอร8ส>าหร,บชนดข1อมEลแบบ char เพ=อให1สามารถอAานหรอเข(ยน
         ข1อมEลข1อใหญAได1
   InputStreamReader และ OutputStreamWriter
     •   เปZนคลาสท(=ใช1ในการแปลงชนดข1อมEลระหวAางชนดข1อมEลแบบ char ก,บชนดข1อมEล
         แบบอ=นๆ
   PrintWriter
     •   เปZนคลาสท(=ใช1ในการเข(ยนข1อความท(เปZน String ท(แปลงมาจากชนดข1อมEลแบบ
                                          =             =
         char
   PushbackReader
     •   เปZนคลาสท(=อน2ญาตให1สAงข1อมEลชนด char ท(เพ=งอAานมากล,บไปย,ง stream ได1
                                                 =
คลาสประเภท stream ระด,บสEง

    ชนด             Byte Stream        Character Stream
                BufferedInputStream     BufferedReader
 Buffering
                BufferedOutputStream    BufferedWriter
                 FilterInputStream       FilterReader
 Filtering
                FilterOutputStream       FilterWriter
   Data           DataInputStream
                                              -
 conversion      DataOutputStream
  Printing          PrintStream          PrintWriter
Peeking ahead   PushbackInputStream     PushbackReader
การเชอมตอ Stream หลายช/น
 เราสามารถเชอมตอ   Stream ไดหลายช/น เชน
    FileInputStream f = new FileInputStream(“text.dat”);
    BufferedInputStream b = new BufferedInputStream(f);
    DataInputStream d = new DataInputStream(b);
คลาส DataInputStream
 คลาส DataInputStream    มเมธอดในการอานขอมลชนดตางๆดงน/
   •   boolean readBoolean()
   •   byte readByte()
   •   char readChar()
   •   double readDouble()
   •   float readFloat()
   •   int readInt()
   •   long readLong()
   •   short readShort()
   •   String readUTF()
คลาส DataOutputStream
   DateOutputStream เป(น     high-level FilterStream ซ3งมเมธอดในการ
    เขยนขอมลชนดตางๆดงน/
     •   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)
ตวอยางของการใช1คลาส 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());
                }
        }
}
ตวอยางโปรแกรม DataInputStream
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());
         }
     }
}
การแปลงขอมลระหวาง byte และ char
 เราสามารถท(=จะแปลง stream ระหวAางชนดข1อมEลแบบ byte และชนดข1อมEล
  แบบ char ได1โดยใช1
   •   คลาส InputStreamReader ซV=งจะอAานชนดข1อมEลแบบ byte แล1วแปลงเปZน
       ชนดข1อมEลแบบ char
   •   คลาส OutputStreamWriter ซV=งจะอAานชนดข1อมEลแบบ char แล1วแปลงเปZน
       ชนดข1อมEลแบบ byte
ตวอยางโปรแกรมเพอเก4บขอความลงในไฟล
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);
ตวอยางโปรแกรมเพอเก4บขอความลงในไฟล
                  p.close();
                  oout.close();
                  fout.close();
           } catch (IOException ex) {
                  System.out.println(ex.toString());
           }
       }
}
ตวอยางโปรแกรมเพออานขอมลจากไฟล
import java.io.*;

public class FileReader {
    public static void main(String args[]) {
        try {
            FileInputStream fin = new FileInputStream("c:data.dat");
            InputStreamReader in = new InputStreamReader(fin);
            BufferedReader bin = new BufferedReader(in);
            System.out.println(bin.readLine());
            System.out.println(bin.readLine());
            bin.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
คลาส File
 คลาสท(=ช=อ FileเปZนคลาสท(=อยEในแพคเก@จ java.io เปZนคลาสท(=ใช1ใน
                                A
  การสร1างออปเจ@คท(=เปZนไฟล8หรอไดเร@กทอร(=
 คลาส File จะม(เมธอดในการจ,ดการก,บไฟล8หรอไดเร@กทอร(= และเมธอดใน
  การสบค1นข1อมEลตAางๆอยEหลายเมธอด
                        A
 ออปเจ@คของคลาส File จะสร1างมาจาก constructor ท(=ม(รEปแบบด,งน(W
   •   public File(String name)
   •   public File(String dir, String name)
   •   public File(File dir, String name)
เมธอดของคลาส File
 เมธอดของคลาส File ท(ใช1ในการสบค1นข1อมEลหรอจ,ดการก,บไฟล8ท(=ส>าค,ญม(
                      =
  ด,งน(W
    •   boolean exists()
    •   boolean isFile()
    •   boolean isDirectory()
    •   String getName()
    •   String getParent()
    •   String []list()
    •   boolean canWrite()
    •   boolean mkdir()
    •   boolean renameTo(File newName)
การสร1างออปเจ@คของคลาส File
 เราสามารถสรางออปเจ4คชนดคลาส File เพอตรวจสอบวามไฟลดงกลาว
  หรอไม
 Constructor ของ FileInputStream/FileOutputStream หรอ
  FileReader/FileWriter ม argument ทเป(นออปเจ4คชนดคลาส File
 ตวอยาง
     File f = new File(“test.dat”);
     if (f.exists()) {
           FileInputStream fir = new FileInputStream(f);
     }
คลาส RandomAccessFile
 ภาษาจาวาม(คลาสท(=สน,บสน2นการอAานหรอเข(ยนไฟล8เปZนแบบ random
  access กลAาวคอไมAจ>าเปZนจะต1องอAานหรอเข(ยนข1อมEลของไฟล8เร(ยงตาม
  ล>าด,บจากต>าแหนAงแรกส2ดไปย,งต>าแหนAงส2ดท1ายของไฟล8 คลาสประเภทน(คอ
                                                                  W
  คลาส RandomAccessFile ซV=งจะใช1เวลาในการอAานหรอเข(ยนข1อมEลใน
  ต>าแหนAงตAางๆเทAาก,น
 คลาส RandomAccessFile จะม( constructor อยEสองรEปแบบด,งน(W
                                            A
   •   public RandomAccessFile(String name,String mode)
   •   public RandomAccessFile(File file,String mode)
       mode อาจก"าหนดเป(น
         •   “r” เป( นการเปcดไ ฟลเพ=ออานขอมล
                   ปZ
         •   “rw” เป( นการเปcด ไฟลเพ=ออานและเขยนขอมล
                      ปZ
เมธอดของคลาส RandomAccessFile
 คลาส RandomAccessFile จะม(เมธอดส>าหร,บการอAานและเข(ยนข1อมEล
  ท(เปZนชนดข1อมEลแบบพนฐานชนดตAางๆคล1ายก,บคลาส
    =                W
  DataInputStream และ DataOutputStream
 คลาส RandomAccessFile ม(เมธอดอ=นๆท(ส>าค,ญเพ=มเตมมาด,งน(W
                                     =
   •   long getFilePointer()
   •   long length()
   •   void seek(long pos)
ObjectStream
 ภาษาจาวามคลาสทใชในการรบและสงขอมลของออปเจ4คทชอ
    •   ObjectInputStream
    •   ObjectOutputStream
 ท,งน(Wออปเจ@คท(=จะสามารถสAงผAาน stream เหลAาน(ได1จะต1องเปZนออปเจ@คของ
    W                                           W
  คลาสท(= implements อนเตอร8เฟส Serializable ซV=งเปZนอนเตอร8เฟส
  ในแพคเก@จ java.io
 ออปเจ@คบางประเภทจะไมAสามารถท(จะ implements อนเตอร8เฟส
                               =
  Serializable ได1 เนองจากข1อมEลของออปเจ@คอาจเปล(=ยนแปลงได1ตลอด
                     =
  เวลา อาทเชAน ออปเจ@คของคลาส Thread หรอ FileInputStream
ObjectStream
 เราสามารถจะระบ2คณล,กษณะของออปเจ@คหรอค2ณล,กษณะของคลาสท(ไมA
                  2                                     =
  ต1องการจะเก@บหรอเร(ยกดEข1อมEลผAาน stream ได1โดยการระบ2ให1ค2ณล,กษณะ
  ด,งกลAาวม( modifier เปZนค(ยเวร8ดท(ช=อ transient ต,วอยAางเชAน
                             8      =
       public class Student implements Serializable {
           private String id,name;
           private double gpa;
           private transient String parent;
       }

 คลาส ObjectOutputStream เปZนคลาสท(ใช1ในการเข(ยนออปเจ@คใดๆลง
                                    =
  ใน stream โดยม(เมธอด writeObject()ท(ใช1ในการเข(ยนข1อมEล
                                      =
 สAวนคลาส ObjectInputStream เปZนคลาสท(=ใช1ในการร,บออปเจ@คใดๆมา
  จาก stream โดยม(เมธอด readObject() ท(=ใช1ในการอAานข1อมEล
ต,วอยAางโปรแกรม
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();
ต,วอยAางโปรแกรม
                        fin = new FileInputStream("data.dat");
                        oin = new ObjectInputStream(fin);
                        Student s2 = (Student) oin.readObject();
                        System.out.print(s2.id);
                        …
                        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
    ผลล,พธ8ท(=ได1จากการร,นโปรแกรม   successfully
                                    ID: 4514452-2
                                    Name: Somchai
                                    GPA: 3.21
สร2ปเนอหาของบท
                            W
 stream เปร(ยบเสมอนทAอสAงข1อมEล สามารถแบAงออกได1เปZน 2 ประเภทคอ
  byte stream และ character stream
 byte stream ม(คลาสพนฐานคอ คลาส InputStream และ
                     W
  OutputStream
 character stream ม(คลาสพนฐานคอ คลาส Reader และ Writer
                          W
 คลาส InputStream จะใช1ในการอAานข1อมEลของ stream และ
  OutputStream จะน>าข1อมEลจากโหนดต1นทางเข1ามาใน stream ส>าหร,บ
  ข1อมEลท(=ม(ชนดข1อมEลเปZนแบบ byte
สร2ปเนอหาของบท
                            W
 คลาส Reader เปZนคลาสท(ใช1ในการอAานข1อมEลของ stream และ
                        =
  คลาสWriter เปZนคลาสท(=ใช1ในการเข(ยนข1อมEลของ stream ส>าหร,บข1อมEลท(=
  ม(ชนดข1อมEลเปZนแบบ char
 คลาสประเภท stream ระด,บสEงท(ส>าค,ญคอ คลาส DataInputStream,
                              =
  DataOutputStream, BufferedInputStream,
  BufferedOutputStream, PrintStream,
  PushbackInputStream, BufferedReader, BufferedWriter,
  InputStreamReader, OutputStreamWriter, PrintWriter
  และ PushbackReader
 การเช=อมตAอ stream หลายช,Wน จะท>าให1สามารถเร(ยกใช1เมธอดได1หลายรEป
  แบบตามความต1องการในการใช1งาน
สร2ปเนอหาของบท
                            W
 คลาส File ใช1ในการสร1างออปเจ@คของไฟล8หรอไดเร@กทอร(= โดยจะม(เมธอด
  ท(ใช1ในการจ,ดการก,บไฟล8
    =
 คลาส RandomAccessFile     จะม(รปแบบในการอAานและเข(ยนข1อมEลเปZน
                                 E
  แบบ random access
 ออปเจ@คท(จะสามารถร,บหรอสAงผAาน stream ได1จะต1องเปZนออปเจ@คของคลาส
           =
  ท(= implements อนเตอร8เฟส Serializable
แบบฝhกห,ด
 ข1อท(= 1
    •   จากโปรแกรมจ>าลองระบบธนาคาร ให1ทดลองเข(ยนโปรแกรมเพอเก@บข1อมEลตAางๆลง
                                                         =
        ไฟล8 และสามารถเร(ยกกล,บมาใช1งานได1อยAางถEกต1อง

Java Programming: คลาสอินพุตและเอาต์พุต

  • 1.
    บทท 10 คลาสอนพตและเอาทพต (Input/Output Classes) ผศ.ธนศา เครอไวศยวรรณ คณะเทคโนโลย(สารสนเทศ สถาบ,นเทคโนโลย(พระจอมเกล1าเจ1าค2ณทหารลาดกระบ,ง
  • 2.
    ว,ตถ2ประสงค8  อธบายความหมายและประเภทของ stream อธบายองค8ประกอบท(ส>าค,ญของแพคเก@จ java.io =  แนะน>าคลาสและเมธอดของคลาส InputStream และ OutputStream  แนะน>าคลาสและเมธอดของคลาส Reader และ Writer  อธบายความแตกตAางระหวAางคลาส Reader และ Writer ก,บ stream  อธบายการสร1างและใช1 stream แบบตAางๆ
  • 3.
    ว,ตถ2ประสงค8  แนะน>าคลาสและเมธอดของคลาส File อธบายการอAาน เข(ยนและอ,พเดทข1อมEลของคลาส RandomAccessFile  อธบายการใช1อนเตอร8เฟสท(=ช=อ Serializable  อธบายวธ(การเข(ยนและอAานข1อมEลของออปเจ@คผAาน stream
  • 4.
    Stream  เปรยบเสมอนทอสงขอมลจากตนทาง (source)ไปยงปลายทาง (sink)  streamชวยท"าใหผเขยนโปรแกรม ไมจ"าเป(นตองทราบรายละเอยดการ ตดตอกบฮารดแวรหรอซอฟตแวรทใชในการสงขอมล เพยงแตตองรเมธอดท ใชในการรบหรอสงขอมล  source เป(นต"าแหนงเรมตนของ stream เรยกวา input stream  sink เป(นต"าแหนงส/นสดของ stream เรยกวา output stream
  • 5.
    Stream  source หรอsink อาจเป(นฮารดแวรหรอซอฟตแวร เชน ไฟล หนวยความจ"า หรอ socket เป(นตน  ภาษาจาวาแบง stream ออกเป(น • byte stream • character stream  ค"าวา stream โดยทวไปจะหมายถ3ง byte stream  reader และ writer จะหมายถ3ง character stream
  • 6.
    แพคเก4จ java.io  คลาสทเกยวกบอนพตและเอาทพตจะถEกก>าหนดโดยJava API ในแพคเก4จ java.io ซV=งจะม(คลาสพWนฐานอยEA 4 คลาสคอ • InputStream เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการร,บชนดข1อมEลแบบ byte = • OutputStream เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการสAงชนดข1อมEลแบบ byte = • Reader เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการร,บชนดข1อมEลแบบ char = • Writer เปZนคลาสท(=ใช1ในการสร1างออปเจ@คท(เปZน stream ในการสAงชนดข1อมEลแบบ char =
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
    คลาสประเภท Byte Stream ภาษาจาวาจะม(คลาสพนฐานในการจ,ดการก,บอนพ2ตและเอาท8พ2ตท(=เปZนชนด W ข1อมEลแบบ byte อยEสองคลาสท(=คEAก,นคอ InputStream และ A OutputStream  คลาสท,WงสองเปZนคลาสแบบ abstract ซV=งเราไมAสามารถท(=จะสร1างออปเจ@ค ของคลาสท,งสองได1 แตAคลาสท,Wงสองจะม(คลาสท(=เปZน subclass ซV=งจะใช1ใน W การสร1างออปเจ@คส>าหร,บการร,บและสAงข1อมEลแบบ byte ของโหนดท(=ม( ต1นทางและปลายทางแบบตAางๆอาทเชAน • FileInputStream และ FileOutputStream เปZนคลาสท(=ใช1ในการสร1าง ออปเจ@คส>าหร,บต1นทางและปลายทางท(=เปZนไฟล8 • ByteArrayInputStream และ ByteArrayOutputStream เปZนคลาสท(=ใช1 ในการสร1างออปเจ@คส>าหร,บต1นทางและปลายทาง ท(=เปZนอะเรย8ของชนดข1อมEลแบบ byte
  • 12.
    คลาส InputStream  คลาสInputStream จะใช1ในการอAานข1อมEลของ stream ท(=เปZนชนดข1อมEล แบบ byte  คลาส InputStream จะน>าข1อมEลจากโหนดต1นทางเข1ามาใน stream และ การอAานข1อมEลจาก stream จะเปZนการลบข1อมEลท(อAานออกจาก stream โดย = ม(เมธอดท(ใช1ส>าหร,บการอAานข1อมEลท(=เปZน byte หรออะเรย8ของ byte = เทAาน,นด,งน(W W • int read() • int read(byte []b) • int read(byte []b,int offset,int length)
  • 13.
    คลาส InputStream  เมธอดอนๆท(ส>าค,ญ = • void close() • int available() • void skip(long n) • boolean markSupported() • void mark(int readlimit) • void reset()
  • 14.
    คลาส OutputStream  คลาสOutputStream จะใช1การสAงข1อมEลของ stream ท(=เปZนชนดข1อมEล แบบ byte การสAงข1อมEลของออบเจ@คชนด Outputstream จะเปZนการเพ=ม ข1อมEลลงใน stream  คลาส OutputStream จะม(เมธอดในการสAงข1อมEลชนด byte ท(=สอดคล1อง ก,บเมธอด read() ในคลาส InputStream โดยคลาสน(Wจะม(เมธอด write() ท(เปZนเมธอดแบบ abstract ในรEปแบบตAางๆด,งน(W = • void write(int c) • void write(byte []b) • void write(byte []b,int offset,int length)
  • 15.
  • 16.
    คลาสประเภท Character Stream ภาษาจาวาก>าหนดคลาสพนฐานในการจ,ดการก,บอนพ2ตและเอาท8พตท(เปZน W 2 = ชนดข1อมEลแบบ char อยEAสองคลาสคอ Reader และ Writer  คลาสท,WงสองเปZนคลาสแบบ abstract โดยม( subclass ท(=สบทอดมาเพอใช1 = ในการสร1างออปเจ@คส>าหร,บจ,ดการก,บโหนดต1นทางและปลายทางในรEปแบบ ตAางๆเชAน ไฟล8 หนAวยความจ>า และไบท8 เปZนต1น
  • 17.
    คลาส Reader  Reader เป(นคลาสทใชในการอานขอมลของ stream ทเป(นชนดขอมลแบบ char  Reader จะมเมธอดทเหมอนกบคลาส InputStream และมหลกการ ท"างานทสอดคลองกนแตจะรบขอมลหรอ argument ทเป(นชนดขอมล char โดยมเมธอดตางๆดงน/ • 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()
  • 18.
    คลาส Writer  Writer เป(นคลาสทใชในการเขยนขอมลของ stream ทเป(นชนดขอมลแบบ char  Writer จะมเมธอดทเหมอนกบคลาส OutputStream และมหลกการท สอดคลองกนแตจะรบขอมลหรอ argument ทเป(นชนดขอมล char โดยม เมธอดตางๆดงน/ • void write(int c) • void write(char []c) • void write(char []c,int offset,int length) • void close() • void flush()  เมธอดเพ=มเตมเพอเข(ยนชนดข1อมEลท(=เปZน String = • void write(String s) • void write(String s,int offset,int length)
  • 19.
    โหนดส>าหร,บ Stream  ภาษาจาวาก>าหนดโหนดท(เปZนต1นทางและปลายทางของstream ไว1สามแบบ = คอ ไฟล8 หนAวยความจ>า และไปป^ (pipe)  ไฟล8คอโหนดส>าหร,บ stream ท(เปZนไฟล8ส>าหร,บอAานหรอเข(ยนข1อมEลชนด = byte  หนAวยความจ>าคอโหนดส>าหร,บ stream ท(=ใช1ส>าหร,บอAานหรอเข(ยนข1อมEลท(= เปZนอะเรย8หรอ String  ไปป^คอโหนดส>าหร,บ stream ท(จะสAงหรอร,บข1อมEลระหวAาง process หรอ = โปรแกรมเธรด
  • 20.
    คลาสทเป(นโหนดส>าหร,บ stream ตAางๆ ชนด Byte Stream Character Stream FileInputStream FileReader File FileOutputStream FileWriter ByteArrayInputStream CharArrayReader Memory: Array ByteArrayOutputStream CharArrayWriter StringReader Memory: String - StringWriter PipedInputStream PipedReader Pipe PipedOutputStream PipedWriter
  • 21.
    ตวอยางโปรแกรม FileCopy.java import java.io.*; publicclass 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) { } } }
  • 22.
    ตวอยางโปรแกรม FileCopyReader.java import java.io.*; publicclass 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) { } } }
  • 23.
    อธบายตวอยางโปรแกรม  โปรแกรม FileCopy.java แสดงต,วอยAางของการก@อบป_`ข1อมEลของไฟล8 หนVงไฟล8ไปย,งไฟล8อ=น โดยใช1 byte stream =  โปรแกรม FileCopyReader.java แสดงต,วอยAางของก@อปป_`ขอมEลของ 1 ไฟล8เชAนเด(ยวก,บโปรแกรม FileCopy.java แตAจะใช1 character stream
  • 24.
    การเช=อมตAอออปเจ@คของคลาส  โดยท,วไปโปรแกรมภาษาจาวาจะใช1ออปเจ@คประเภท streamมากกวAาหนVง = = ออปเจ@คโดยจะเช=อมออปเจ@คของ stream ตAางๆเข1าด1วยก,นเพ=อใช1ในการ แปลงชนดข1อมEลประเภทตAางๆ  ตวอยางแสดงการเชอมตอออปเจ@คของคลาส FileInputStream ทอาน ขอมลเข1ามาโดยม(ชนดข1อมEลเป(น byte เขากบออปเจ@คของคลาส DataInputStream เพอใชอานขอมลชนดอนๆได1มากขVWนเชน FileInputStream fin = new FileInputStream(“test.dat”); DataInputStream din = new DataInputStream(fin);
  • 25.
    คลาสประเภท stream ระด,บสEง ออปเจ@คท(ใช1ในการเช=อมตAอ stream จะเปZนออปเจ@คของคลาสประเภท = steam ระด,บสEง (high-level stream) ซV=งสามารถท(จะอAานหรอเข(ยนข1อมEลท(= = เปZนชนดข1อมEลอ=นๆแล1วแปลงข1อมEลให1เปZนชนดข1อมEลแบบ byte หรอม( บ,ฟเฟอร8ในการเพ=มประสทธภาพในการอAานหรอเข(ยนข1อมEล  คลาสเหลAาน(จะไมAสามารถอAานหรอเข(ยนข1อมEลไปย,งโหนดต1นทางหรอปลาย W ทางท(เปZนไฟล8 หนAวยความจ>า หรอ Pipe ได1โดยตรง แตAจะร,บข1อมEลมาจาก = stream อ=นๆท(=เปZนคลาสพนฐานในการอAานหรอเข(ยนข1อมEล W
  • 26.
    คลาสประเภท stream ระด,บสEงท(ส>าค,ญ =  DataInputStream และ DataOutputStream • เปZนคลาสท(=ใช1ในการแปลงชนดข1อมEลระหวAางชนดข1อมEลแบบ byte ก,บชนดข1อมEล แบบอ=นๆ  BufferedInputStream และ BufferedOutputStream • เปZนคลาสท(=ม(บ,ฟเฟอร8ส>าหร,บชนดข1อมEล byte อยEAภายในเพ=อให1สามารถอAานหรอ เข(ยนข1อมEลขนาดใหญA ซV=งจะชAวยเพ=มประสทธภาพในการอAานหรอเข(ยนข1อมEล  PrintStream • เปZนคลาสท(=ใช1ในการเข(ยนข1อความท(เปZน String ท(แปลงมาจากชนดข1อมEลแบบ = = byte ออปเจ@คท(=ชอ out และ err ท(=อยEในคลาสท(=ชอ System เปZนต,วอยAางขอ = A = งออปเจ@คท(ใช1คลาสน(W =  PushbackInputStream • คลาสน/อนญาตใหสงขอมลชนด byte ทเพงอานมากลบไปยง stream ได
  • 27.
    คลาสประเภท stream ระด,บสEงท(ส>าค,ญ =  ButteredReader และ BufferedWriter • เปZนคลาสท(=ม(บ,ฟเฟอร8ส>าหร,บชนดข1อมEลแบบ char เพ=อให1สามารถอAานหรอเข(ยน ข1อมEลข1อใหญAได1  InputStreamReader และ OutputStreamWriter • เปZนคลาสท(=ใช1ในการแปลงชนดข1อมEลระหวAางชนดข1อมEลแบบ char ก,บชนดข1อมEล แบบอ=นๆ  PrintWriter • เปZนคลาสท(=ใช1ในการเข(ยนข1อความท(เปZน String ท(แปลงมาจากชนดข1อมEลแบบ = = char  PushbackReader • เปZนคลาสท(=อน2ญาตให1สAงข1อมEลชนด char ท(เพ=งอAานมากล,บไปย,ง stream ได1 =
  • 28.
    คลาสประเภท stream ระด,บสEง ชนด Byte Stream Character Stream BufferedInputStream BufferedReader Buffering BufferedOutputStream BufferedWriter FilterInputStream FilterReader Filtering FilterOutputStream FilterWriter Data DataInputStream - conversion DataOutputStream Printing PrintStream PrintWriter Peeking ahead PushbackInputStream PushbackReader
  • 29.
    การเชอมตอ Stream หลายช/น เราสามารถเชอมตอ Stream ไดหลายช/น เชน FileInputStream f = new FileInputStream(“text.dat”); BufferedInputStream b = new BufferedInputStream(f); DataInputStream d = new DataInputStream(b);
  • 30.
    คลาส DataInputStream  คลาสDataInputStream มเมธอดในการอานขอมลชนดตางๆดงน/ • boolean readBoolean() • byte readByte() • char readChar() • double readDouble() • float readFloat() • int readInt() • long readLong() • short readShort() • String readUTF()
  • 31.
    คลาส DataOutputStream  DateOutputStream เป(น high-level FilterStream ซ3งมเมธอดในการ เขยนขอมลชนดตางๆดงน/ • 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)
  • 32.
    ตวอยางของการใช1คลาส DataOutputStream import java.io.*; publicclass 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()); } } }
  • 33.
    ตวอยางโปรแกรม DataInputStream import java.io.*; publicclass 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);
  • 34.
    ตวอยางโปรแกรม DataInputStream din.close(); fin.close(); } catch (IOException ex) { System.out.println(ex.toString()); } } }
  • 35.
    การแปลงขอมลระหวาง byte และchar  เราสามารถท(=จะแปลง stream ระหวAางชนดข1อมEลแบบ byte และชนดข1อมEล แบบ char ได1โดยใช1 • คลาส InputStreamReader ซV=งจะอAานชนดข1อมEลแบบ byte แล1วแปลงเปZน ชนดข1อมEลแบบ char • คลาส OutputStreamWriter ซV=งจะอAานชนดข1อมEลแบบ char แล1วแปลงเปZน ชนดข1อมEลแบบ byte
  • 36.
    ตวอยางโปรแกรมเพอเก4บขอความลงในไฟล import java.io.*; public classFileWriter { 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);
  • 37.
    ตวอยางโปรแกรมเพอเก4บขอความลงในไฟล p.close(); oout.close(); fout.close(); } catch (IOException ex) { System.out.println(ex.toString()); } } }
  • 38.
    ตวอยางโปรแกรมเพออานขอมลจากไฟล import java.io.*; public classFileReader { public static void main(String args[]) { try { FileInputStream fin = new FileInputStream("c:data.dat"); InputStreamReader in = new InputStreamReader(fin); BufferedReader bin = new BufferedReader(in); System.out.println(bin.readLine()); System.out.println(bin.readLine()); bin.close(); } catch (IOException ex) { ex.printStackTrace(); } } }
  • 39.
    คลาส File  คลาสท(=ช=อFileเปZนคลาสท(=อยEในแพคเก@จ java.io เปZนคลาสท(=ใช1ใน A การสร1างออปเจ@คท(=เปZนไฟล8หรอไดเร@กทอร(=  คลาส File จะม(เมธอดในการจ,ดการก,บไฟล8หรอไดเร@กทอร(= และเมธอดใน การสบค1นข1อมEลตAางๆอยEหลายเมธอด A  ออปเจ@คของคลาส File จะสร1างมาจาก constructor ท(=ม(รEปแบบด,งน(W • public File(String name) • public File(String dir, String name) • public File(File dir, String name)
  • 40.
    เมธอดของคลาส File  เมธอดของคลาสFile ท(ใช1ในการสบค1นข1อมEลหรอจ,ดการก,บไฟล8ท(=ส>าค,ญม( = ด,งน(W • boolean exists() • boolean isFile() • boolean isDirectory() • String getName() • String getParent() • String []list() • boolean canWrite() • boolean mkdir() • boolean renameTo(File newName)
  • 41.
    การสร1างออปเจ@คของคลาส File  เราสามารถสรางออปเจ4คชนดคลาสFile เพอตรวจสอบวามไฟลดงกลาว หรอไม  Constructor ของ FileInputStream/FileOutputStream หรอ FileReader/FileWriter ม argument ทเป(นออปเจ4คชนดคลาส File  ตวอยาง File f = new File(“test.dat”); if (f.exists()) { FileInputStream fir = new FileInputStream(f); }
  • 42.
    คลาส RandomAccessFile  ภาษาจาวาม(คลาสท(=สน,บสน2นการอAานหรอเข(ยนไฟล8เปZนแบบrandom access กลAาวคอไมAจ>าเปZนจะต1องอAานหรอเข(ยนข1อมEลของไฟล8เร(ยงตาม ล>าด,บจากต>าแหนAงแรกส2ดไปย,งต>าแหนAงส2ดท1ายของไฟล8 คลาสประเภทน(คอ W คลาส RandomAccessFile ซV=งจะใช1เวลาในการอAานหรอเข(ยนข1อมEลใน ต>าแหนAงตAางๆเทAาก,น  คลาส RandomAccessFile จะม( constructor อยEสองรEปแบบด,งน(W A • public RandomAccessFile(String name,String mode) • public RandomAccessFile(File file,String mode) mode อาจก"าหนดเป(น • “r” เป( นการเปcดไ ฟลเพ=ออานขอมล ปZ • “rw” เป( นการเปcด ไฟลเพ=ออานและเขยนขอมล ปZ
  • 43.
    เมธอดของคลาส RandomAccessFile  คลาสRandomAccessFile จะม(เมธอดส>าหร,บการอAานและเข(ยนข1อมEล ท(เปZนชนดข1อมEลแบบพนฐานชนดตAางๆคล1ายก,บคลาส = W DataInputStream และ DataOutputStream  คลาส RandomAccessFile ม(เมธอดอ=นๆท(ส>าค,ญเพ=มเตมมาด,งน(W = • long getFilePointer() • long length() • void seek(long pos)
  • 44.
    ObjectStream  ภาษาจาวามคลาสทใชในการรบและสงขอมลของออปเจ4คทชอ • ObjectInputStream • ObjectOutputStream  ท,งน(Wออปเจ@คท(=จะสามารถสAงผAาน stream เหลAาน(ได1จะต1องเปZนออปเจ@คของ W W คลาสท(= implements อนเตอร8เฟส Serializable ซV=งเปZนอนเตอร8เฟส ในแพคเก@จ java.io  ออปเจ@คบางประเภทจะไมAสามารถท(จะ implements อนเตอร8เฟส = Serializable ได1 เนองจากข1อมEลของออปเจ@คอาจเปล(=ยนแปลงได1ตลอด = เวลา อาทเชAน ออปเจ@คของคลาส Thread หรอ FileInputStream
  • 45.
    ObjectStream  เราสามารถจะระบ2คณล,กษณะของออปเจ@คหรอค2ณล,กษณะของคลาสท(ไมA 2 = ต1องการจะเก@บหรอเร(ยกดEข1อมEลผAาน stream ได1โดยการระบ2ให1ค2ณล,กษณะ ด,งกลAาวม( modifier เปZนค(ยเวร8ดท(ช=อ transient ต,วอยAางเชAน 8 = public class Student implements Serializable { private String id,name; private double gpa; private transient String parent; }  คลาส ObjectOutputStream เปZนคลาสท(ใช1ในการเข(ยนออปเจ@คใดๆลง = ใน stream โดยม(เมธอด writeObject()ท(ใช1ในการเข(ยนข1อมEล =  สAวนคลาส ObjectInputStream เปZนคลาสท(=ใช1ในการร,บออปเจ@คใดๆมา จาก stream โดยม(เมธอด readObject() ท(=ใช1ในการอAานข1อมEล
  • 46.
    ต,วอยAางโปรแกรม import java.io.*; public classObjectPersistenceDemo { 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();
  • 47.
    ต,วอยAางโปรแกรม fin = new FileInputStream("data.dat"); oin = new ObjectInputStream(fin); Student s2 = (Student) oin.readObject(); System.out.print(s2.id); … 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 ผลล,พธ8ท(=ได1จากการร,นโปรแกรม successfully ID: 4514452-2 Name: Somchai GPA: 3.21
  • 48.
    สร2ปเนอหาของบท W  stream เปร(ยบเสมอนทAอสAงข1อมEล สามารถแบAงออกได1เปZน 2 ประเภทคอ byte stream และ character stream  byte stream ม(คลาสพนฐานคอ คลาส InputStream และ W OutputStream  character stream ม(คลาสพนฐานคอ คลาส Reader และ Writer W  คลาส InputStream จะใช1ในการอAานข1อมEลของ stream และ OutputStream จะน>าข1อมEลจากโหนดต1นทางเข1ามาใน stream ส>าหร,บ ข1อมEลท(=ม(ชนดข1อมEลเปZนแบบ byte
  • 49.
    สร2ปเนอหาของบท W  คลาส Reader เปZนคลาสท(ใช1ในการอAานข1อมEลของ stream และ = คลาสWriter เปZนคลาสท(=ใช1ในการเข(ยนข1อมEลของ stream ส>าหร,บข1อมEลท(= ม(ชนดข1อมEลเปZนแบบ char  คลาสประเภท stream ระด,บสEงท(ส>าค,ญคอ คลาส DataInputStream, = DataOutputStream, BufferedInputStream, BufferedOutputStream, PrintStream, PushbackInputStream, BufferedReader, BufferedWriter, InputStreamReader, OutputStreamWriter, PrintWriter และ PushbackReader  การเช=อมตAอ stream หลายช,Wน จะท>าให1สามารถเร(ยกใช1เมธอดได1หลายรEป แบบตามความต1องการในการใช1งาน
  • 50.
    สร2ปเนอหาของบท W  คลาส File ใช1ในการสร1างออปเจ@คของไฟล8หรอไดเร@กทอร(= โดยจะม(เมธอด ท(ใช1ในการจ,ดการก,บไฟล8 =  คลาส RandomAccessFile จะม(รปแบบในการอAานและเข(ยนข1อมEลเปZน E แบบ random access  ออปเจ@คท(จะสามารถร,บหรอสAงผAาน stream ได1จะต1องเปZนออปเจ@คของคลาส = ท(= implements อนเตอร8เฟส Serializable
  • 51.
    แบบฝhกห,ด  ข1อท(= 1 • จากโปรแกรมจ>าลองระบบธนาคาร ให1ทดลองเข(ยนโปรแกรมเพอเก@บข1อมEลตAางๆลง = ไฟล8 และสามารถเร(ยกกล,บมาใช1งานได1อยAางถEกต1อง