Chapter4

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Chapter4 as PDF for free.

More details

  • Words: 1,755
  • Pages: 11
CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

บทที่ 4 คําสั่งสําหรับ Input และ Output ในการพัฒนาโปรแกรมประเภท application ในการทํางานแบบ text mode นัน้ ภาษา Java ไดจัด เตรียม class สําหรับทํางานเกี่ยวกับ input และ output ไวดังนี้ 4.1 การรับขอมูลผานทางคียบอรด ในการเขียนโปรแกรมเพื่อรับขอมูลผานทางคียบอรด โดยใชภาษา Java นัน้ มีหลักการทํางานเบื้องตน ดังนี้ ในการนําขอมูลเขา หรือ สงออกเพื่อแสดงผล เริ่มจาก Java จะเปด data stream และจัดการอานขอ มูลเขาโดยไมสนใจวา data stream นีต้ อ กับอุปกรณใด หลังจากนั้นจะทําการอาน หรือ เขียนขอมูล โดยขอมูล จะถูกอานหรือเขียนครั้งละ 1 byte เทานั้น เมื่อขอมูลถูกอานหรือบันทึกจนหมด data stream นัน้ จะถูกปด package ทีจ่ ดั การดาน Input / Output ที่สําคัญคือ java.io และ Java จะแบง class ในการจัดการ อานหรือเขียนขอมูล 2 ประเภท คือ character หรือ byte เหตุผลที่แยกออกเปน 2 class นี้ เนื่องจากขนาดของ character เทากับ 2 byte แบบ Unicode นัน่ เอง แตไมวาจะอานเปนแบบ character หรือ byte หลักการอาน หรือเขียนจะเหมือนกันโดยผาน data stream ในการรับขอมูลผานทางคียบอรด จะตองมีการจัดการกับความผิดพลาดที่อาจเกิดขึ้นในการประมวล ผล ซึง่ การจัดการเชนนี้ เรียกวา throwing the exception ทัง้ นีเ้ นือ่ งจากการเขียนโปรแกรมที่ดีตองไมให โปรแกรมหยุดทํางานกลางคันโดยไมทราบสาเหตุ ผูเขียนโปรแกรมจึงจําเปนตองเขียนโปรแกรมจัดการกับขอผิด พลาดเหลานัน้ เชน ในการหาคาเฉลี่ย ซึ่งตองมีการหารดวยตัวเลข ผูใชโปรแกรมอาจไมใสขอมูลใดๆ เลย หรือ อาจใส 0 ก็ได ซึ่งการหารดวยศูนยในทางคอมพิวเตอร จะไมสามารถหาผลลัพธได โปรแกรมจะใชตัว exception นีต้ รวจสอบขอผิดพลาดที่อาจเกิดขึ้นและแสดงใหผูใชงานทราบ 4.1.1

การรับคาผานคียบอรดอยางงาย ใน class System ซึง่ เปน class มาตรฐานของ Java มีการประกาศตัวแปร 3 ตัว คือ in, out และ err

ดังนี้ public static final InputStream in; public static final PrintStream out; public static fianl PrintStream err; ทัง้ 3 ตัวแปรถูกประกาศแบบ static และ final หมายความวา ตัวแปรเหลานี้ถูกเรียกผาน class โดย ไมจําเปนตองสราง object ในการรับขอมูล System.in จัดเปนมาตรฐานในการนําขอมูลเขาผานทางคียบอรดในลักษณะของ byte 2/2545

1

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

ตัวอยางที่ 1 class KeybRead { public static void main (String args[]) { char buf = ‘\0’; try { buf = (char) System.in.read(); } catch (Exception e) { System.out.println (“Error:”+e.toString()); } System.out.println(“Your input data is “+buf); } }

System.in.read จะรับคาขอมูลผานทางคียบอรด โดยขอมูลที่อานเขามาจะเปน byte และแปลงเปน integer แตในตัวอยางที่ 1 พบวาตัวแปรที่รับคาจาก System.in.read มีชนิดเปน char ดังนัน้ จึงตองเพิ่ม (char) ไวหนา System.in.read เพือ่ เปนการแปลงขอมูลใหมีชนิดเปน character อีกทีหนึ่ง และผลจากการรับ ขอมูลในแบบของ character ทําใหตัวแปร buf จึงเก็บขอมูลเพียงอักษรตัวแรกที่บันทึกผานคียบอรดเทานั้น สําหรับการทํางานใน method read จะรอจนมีขอมูลเขา หรือรอจนผูใชบันทึกขอมูล และจะอานขอมูล เก็บไปเรื่อยๆ จนกระทั่งผูใชกดปุม Enter แลวจึงแปลงขอมูลใสหนวยความจําของผูใชตอไป ในสวนของการจัดการ throwing exception ทําไดดวยคําสั่ง try {…} catch {…} โดยใสคําสั่งอานขอ มูลใน block ของ try {…} สวนคําสั่งใน block ของ catch เปนคําสั่งในการจัดการ error ตางๆ ที่ไมคาดวาจะ เกิดขึน้ โดยสวนมากมักเปนการแสดงขอความบนจอภาพใหผูใชทราบถึงขอผิดพลาด ตัวอยางที่ 2 จะเปนตัวอยางสําหรับการรับขอมูลไดมากกวา 1 ตัวอักษร โดยใช System.in.read() โดยใช loop while ในการวนรับคาจนกระทั่งพบ '\n' หรือการกดคีย Enter นัน่ เอง ตัวอยางที่ 2 class KeybRead2 { public static void main (String args[]) { char buf = ‘\0’; StringBuffer bufOut = new StringBuffer(); try { while ((buf = (char)System.in.read()) != ‘\n’) { bufOut.append(buf); } } catch (Exception e) { System.out.println (“Error:”+e.toString()); } System.out.println(“Your input data is “+bufOut); } }

2/2545

2

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

ในตัวอยางที่ 2 นี้จะพบวามีการประกาศ object ชื่อ bufOut จาก class StringBuffer ซึง่ โปรแกรมจะ ใช method append ที่อยูใน class นีใ้ นการเชือ่ มตัวอักษรตางๆ ที่รับจากผูใชผานทางคียบอรด 4.1.2

การรับขอมูลตัวเลขผานคียบอรด

สายอักขระที่รับผานคียบอรดนั้น สามารถใช method ใน class Integer และ Double ซึง่ เปน Type wrappers ในการเปลีย่ นขอมูลสายอักขระเปนจํานวนเต็ม และจํานวนจริง ตามลําดับ Type wrapper เปนกลุมของ class ที่อยูใน package java.lang ซึง่ มีชื่อเหมือนกับ primitive data type (เชน int หรือ double) แตละ class ของ type wrapper จะขึน้ ตนชื่อดวยตัวพิมพใหญ (เนื่องจากเปนชื่อ class ) เชน Integer หรือ Double โดยจะมี method ตางๆ ที่ใชในการจัดการกับขอมูล primitive data type เชน การ convert จาก String เปน integer ซึ่ง primitive data type ไมสามารถทําได ตัวอยางตอไปนี้ เปนการแสดงถึงคุณสมบัติหลักประการหนึ่งของการเขียนโปรแกรมแบบเชิงวัตถุ นั่น คือ การนํากลับมาใชใหม โดยเปนการสราง class InputBox เพือ่ รับขอมูลผานทางคียบอรดเทานั้น โดยจะมี method หลักที่ใชในการรับขอมูล ชื่อ getInput() และจะมีอีก 3 method คือ รับเปนจํานวนเต็ม (getInteger()) รับเปนจํานวนจริง (getDouble()) และรับเปนขอความ (getString()) ซึง่ เปนการเรียกใช method getInput() มา ทํางาน ตัวอยางที่ 3 class InputBox { public String getInput() { char buf = ‘\0’; StringBuffer bufIn = new StringBuffer(); try { while ((buf = (char) System.in.read()) != ‘\n’) { bufIn.append (buf); } } catch (Exception e) { System.out.println(“Error:” + e.toString()); } return bufIn.toString(); } public int getInteger() { int value = 0; boolean done = false; while (!done) { try { value = Integer.parseInt(getInput().trim()); done = true; } catch (NumberFormatException e) { System.out.println(“Input error, Try integer”); } } // end while return value; } // end getInteger

2/2545

3

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

ตัวอยางที่ 3 (ตอ) public double getDouble() { double value = 0; boolean done = false; while (!done) { try { Double y = new Double(getInput()); value = y.doubleValue(); done = true; } catch (NumberFormatException e) { System.out.println(“Input error, Try double value”); } } // end while return value; } // end getDouble public String getString() { return getInput(); } // end getString } // class InputBox class KeybRead3 { public static void main (String args[]) throws Exception { InputBox input = new InputBox(); int noOfGuest; double rate; String party; System.out.print(“Enter your Party Name “); party = input.getString(); System.out.println(); System.out.print(“Enter number of guest “); noOfGuest = input.getInteger(); System.out.println(); System.out.print(“Enter Rate: ”); rate = input.getDouble(); System.out.println(); System.out.println(“Total Cost is “ + (rate * noOfGuest)); } // end of main } // end KeybRead3

จากตัวอยางโปรแกรมที่ 3 สามารถสรุปไดดังนี้ - getInteger() จะเปน method จัดการเปลี่ยนขอมูลที่รับผานคียบอรดเปนจํานวนเต็ม ในการ ทํางานของ method นี้ จะมีการตรวจสอบขอมูลที่รับเขามาวาเปนจํานวนเต็มหรือไม โดยมีขั้น ตอนการทํางานดังนี้ 1. การตรวจสอบขอมูลวาเปนจํานวนเต็มหรือไม ดวยคําสั่ง try{…} catch (e) {…} หากขอมูล เปนจํานวนเต็ม โปรแกรมจะ convert จาก string ใหเปน integer โดยใช Integer.parseInt

2/2545

4

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

(getInput().trim()); แตหากขอมูลไมใชจํานวนเต็ม โปรแกรมจะแสดงขอความบอกผูใชวาให พิมพเฉพาะจํานวนเต็มเทานั้น 2. เนื่องจาก class type wrapper Integer เปน static method ดังนั้นการ convert จาก string ใหเปน integer จึงสามารถเรียกใช method นีไ้ ดเลย ไมจําเปนตองสราง object กอน 3. กอนทีจ่ ะเปลีย่ นเปนจํานวนเต็ม ขอมูลจะถูกตัดชองวางในสวนทายออก (ถามี) ดวยคําสั่ง trim() ซึง่ เปน method ทีอ่ ยูใน class String -

-

4.1.3

getDouble() เปน method ในการรับขอมูลจํานวนจริง หลักการทํางานโดยทั่วไปจะเหมือนกับ method getInteger() แตการเปลี่ยนขอความเปนจํานวนจริงจะใช class ทีต่ างกัน คือ Double ซึง่ จําเปนตองสราง object กอนจึงจะสามารถเรียกใช method doubleValue() ได getString() เปน method ในการรับขอมูลที่เปนขอความใดๆ method ดังกลาวไมตองมีการจัด การใดๆ เนื่องจากขอมูลที่รับเขามาจาก method getInput() มีชนิดขอมูลเปนแบบ String อยูแลว

การรับขอมูลจากคียบอรดโดยใช BufferedReader

BufferedReader เปน sub-class ของ class Reader ซึง่ ใชในการอานขอมูลแบบ character โดยจะ อยูใน package java.io.* ในหัวขอที่ 4.1.1 และ 4.1.2 เปนการอานขอมูลโดยใช InputStream ซึง่ จะอานขอ มูลเปน byte ตัวอยางที่ 4 เปนการแสดงขั้นตอนในการเขียนโปรแกรมที่มีการใช buffer เพือ่ อานขอมูล การอาน จาก buffer จะประมวลผลไดรวดเร็วกวาการอานโดยตรง (System.in ไมมี buffer) และเรียกใช class Reader ซึง่ จะอานขอมูลเปน character เลย ดังไดกลาวมาแลวขางตน import java.io.*; public class KeybRead4 { public static void main (String args[] ) { InputStreamReader reader = new InputStreamReader(System.in); BufferedReader input = new BufferedReader(reader); String text = “ “; int aNumber = 0; System.out.print(“Enter no of guest: “); try { text = input.readLine(); aNumber = Integer.parseInt(text); System.out.print(“Enter rate: “); text = input.readLine(); } catch (Exception e) { System.out.println(e); System.exit(1); } Double x = new Double(text); double rate = x.doubleValue(); System.out.println(“The answer is “ + (rate * aNumber)); } }

2/2545

5

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

ขัน้ ตอนการทํางานของ class BufferedReader แสดงดังในรูปขางลางนี้ input BufferedReader

InputStreamReader

InputStream

String readLine()

char read()

byte read()

System.in การทํางานของ class BufferedReader ยังตองผาน System.in ซึง่ เรียก method ของ InputStream เหมือนหลักการเดิม แตเพื่อไมตองเสียเวลาในการอานตัวอักษร และตองแปลงรหัสจาก byte เปน char จึงเรียก InputStreamReader ซึง่ เปน sub-class ของ class Reader มาชวยในการแปลงรหัส และ BufferedReader เปน buffer ในการอานขอมูลเปนชุด 4.1.4

การรับขอมูลจากคียบอรดโดยใช DataInputStream class DataInputStream เปน sub-class ของ class FilterInputStream และ class InputStream

class DataInputStream จะใหความสะดวกในการอานขอมูลพื้นฐานตางๆ ของ Java ตัวแปรที่ตอง ผานใหกับ class นี้ คือ System.in (InputStream) โดยมี method ในการอานขอมูลพื้นฐานตางๆ ดังนี้ 1. final String readLine() อานขอมูลตัวอักษรที่จบดวยการขึ้นบรรทัดใหม (\n) การกดปุม Enter (\r) หรือ จบแฟมขอมูล (EOF) 2. final int readInt() และ final long readLong() อานขอมูลจํานวนเต็ม 3. final float readFloat() และ final double readDouble() อานขอมูลจํานวนจริง 4. final int readUnsignedByte() อานจํานวนเต็มที่ไมรวมเครื่องหมาย อยางไรก็ตามเฉพาะ method readLine() เทานัน้ ที่ใชไดกับการอานขอมูลผานทางคียบอรด สวน method อืน่ ใชสําหรับการอานขอมูลในแฟมขอมูล (file) ทัง้ นี้เพราะ method อื่นๆ เชน readInt() จะอานขอมูล แบบจํานวนเต็ม ซึ่งจะกินเนื้อที่ของหนวยความจําขนาด 2 byte แตขอมูลที่รับผานคียบอรด จะเปนแบบ character เทานั้น

2/2545

6

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

ตัวอยางที่ 5 import java.io.*; public class KeybRead5 { public static void main (String args[] ) { DataInput input = new DataInputStream(System.in); String text = “ “; int noOfguest = 0; double rate = 0; System.out.print(“Enter no. of guest: “); try { noOfguest = Integer.parseInt(input.readLine()); System.out.println(“no of guest “+ noOfguest); System.out.print(“Enter rate: “); Double x = new Double (input.readLine()); rate = x.doubleValue(); } catch (IOException e) { System.out.println(e); System.exit(1); } System.out.println(“the answer is “+(rate*noOfguest)); } }

4.2 การอาน – เขียนขอมูลผานแฟมขอมูล ( file ) การอานขอมูลจากแฟมขอมูล ใชหลักการเดียวกับการอานขอมูลจากคียบอรด แตเปลี่ยนอานขอมูล จากคียบอรด เปนแฟมขอมูล และเรียก class FileReader / FileWriter หรือ FileInputStream / FileOutputStream ซึง่ ใชสําหรับการอานและเขียนแฟมขอมูล หลักการเขียนโปรแกรมเพื่ออานหรือเขียนแฟมขอมูล ประกอบดวยขั้นตอน ดังนี้ 1. ประกาศแฟมขอมูล หรือ ระบุตําแหนงของแฟมขอมูล เชน directory ดวย class File 2. เปดแฟมขอมูลดวยคําสั่ง FileReader / FileWriter หรือ FileInputStream / FileOutputStream 3. อานขอมูล โดยจะขึ้นอยูกับเทคนิคในการอานแฟมขอมูล ถาตองการอานทีละบรรทัด ตองเรียก ใช class ที่มี method readLine() 4. ปดแฟมขอมูล close()

2/2545

7

CS313: Object-Oriented Programming

4.2.1

บทที่ 4: คําสั่งสําหรับ Input และ Output

การอานแฟมขอมูลที่ใช buffer ตัวอยางที่ 5

import java.io.*; public class ReadFile1 { public static void main(String args[]) { FileReader infile; BufferedReader in = null; String buf = null; boolean eof = false; try { // open file infile = new FileReader(“test1.txt”); in = new BufferedReader(infile); } catch (IOException e) { System.out.println(“File not found”); System.exit(1); } while (!eof) { try { buf = in.readLine(); if (buf == null) eof = true; else System.out.println(buf); } catch (IOException e) { System.out.println(“End of file”); } } } }

4.2.2

การอานและจัดเก็บแฟมขอมูลแบบระเบียน ตัวอยางที่ 6

import java.io.*; public class ReadFile2 { public static void main (String args[]) { FileReader infile; BufferedReader in = null; String buf = null; boolean eof = false; try { infile = new FileReader (“test2.txt”); in = new BufferedReader (infile); }

2/2545

8

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

ตัวอยางที่ 6 (ตอ) catch (IOException e) { System.out.println(“File not found”); System.exit(1); } while (!eof) { try { buf = in.readLine(); if (buf == null) eof = true; else { String buf1; System.out.println(buf+” “+buf.length()); System.out.println(buf.substring(0,29)); System.out.println(buf.substring(30,59)); System.out.println(buf.substring(60,79)); System.out.println(buf.substring(80,109)); System.out.println(buf.substring(110,111)); } } catch (IOException e) { System.out.println(“End of file”); } } } }

สําหรับโครงสรางแฟมขอมูลของตัวอยางที่ 6 มีดังนี้ ชื่อหนังสือ char(30) ผูแตง char(30) เลขหมูหนังสือ char(20) สํานักพิมพ char(30) สถานะ char(2) ขอมูลจะถูกอานทีละ record (ทีละบรรทัด) ดังนั้นจึงตองมีการแยก field ซึง่ สามารถทําไดโดยใช method substring(int s, int e) ของ class String โดย s คือตําแหนงอักขระเริ่มตนของการอาน และ e คือ ตําแหนงอักขระสุดทายที่ถูกอาน 4.2.3

การอานขอมูลที่แตละ field แบงดวยชองวาง (space)

ในการอานขอมูลที่สามารถแยก field ดวยอักขระพิเศษ เชน เครื่องหมาย space หรือ comma ทําได โดยใช class StreamTokenizer

2/2545

9

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

การทํางานของ class นี้ จะอานขอมูลทีละ token (กลุม อักขระ) อีกทั้งสามารถแยกอักขระออกจาก กัน หากในอักขระดังกลาวประกอบดวยอักขระพิเศษที่ผูใชกําหนดในคําสั่ง commentChars(int c) โดยที่ c เปน รหัสอักขระพิเศษนั้น ถาเปนการคั่นดวยชองวาง ทําไดโดยเรียกใช method whitespaceChars(0,32); ตัวอยางที่ 7 import java.io.*; public class DemoStreamToken { public static void main (String args[] ) throws IOException { FileReader r = new FileReader(“test1.txt”); StreamTokenizer inStream = new StreamTokenizer ( r ); inStream.whitespaceChars(0,32); boolean eof = false; do { int token = inStream.nextToken(); switch (token) { case StreamTokenizer.TT_EOF : eof = true; case StreamTokenizer.TT_EOL : break; case StreamTokenizer.TT_WORD : System.out.println(“Word: “+inStream.sval); break; case StreamTokenizer.TT_NUMBER : System.out.println(“Number: “+inStream.nval); break; } } while (!eof); } }

4.2.4

การอานขอมูลและบันทึกขอมูลแบบ binary ตัวอยางที่ 8

import java.io.*; public class FileIOApp { public static void main (String args[]) throws IOException { File file = new File (“test.txt”); FileOutputStream outFile = new FileOutputStream(file); DataOutputStream outs = new DataOutputStream(outFile); outs.writeBoolean(true); outs.writeInt(950); outs.writeChar(‘a’); outs.writeDouble(2575.50); System.out.println(outs.size() + “byte were written”); outs.close(); outFile.close(); FileInputStream inFile = new FileInputStream(file); DataInputStream ins = new DataInputStream(inFile);

2/2545

10

CS313: Object-Oriented Programming

บทที่ 4: คําสั่งสําหรับ Input และ Output

ตัวอยางที่ 8 (ตอ) System.out.println(ins.readBoolean()); System.out.println(ins.readInt()); System.out.println(ins.readChar()); System.out.println(ins.readDouble()); ins.close(); inFile.close(); } }

การบันทึกขอมูลแบบ binary ไมสามารถเปดดูแฟมขอมูลโดยใช editor ดังนัน้ การอานขอมูลจึงจํา เปนตองใช method เฉพาะ เชน readInt() สําหรับการอานขอมูลแบบ integer ทีถ่ กู จัดเก็บแบบ binary 4.3 สรุปโครงสราง subclass ของ package java.io java.lang.Object File FileDescriptor InputStream ByteArrayInputStream FileInputStream FilterInputStream BufferedInputStream DataInputStream PushbackInputStream ObjectInputStream PipedInputStream SequenceInputStream

OutputStream ByteArrayOutputStream FileOutputStream FilterOutputStream BufferedOutputStream DataOutputStream PrintStream ObjectOutputStream PipedOutputStream

RandomAccessFile Reader BufferedReader LineNumberReader CharArrayReader FilterReader PushbackReader InputStreamReader FileReader PipedReader StringReader

Writer BufferedWriter CharArrayWriter FilterWriter OutputStreamWriter FileWriter PipedWriter PrintWriter StringWriter

2/2545

11

Related Documents

Chapter4
July 2020 12
Chapter4
November 2019 17
Chapter4
June 2020 11
Chapter4
June 2020 17
Chapter4
May 2020 14
Chapter4
October 2019 14