Java Progamming Operasi I/O Disampaikan pada mata kuliah Object Oriented Programming Pengenalan Streams Dalam Java, operasi I/O menggunakan streams. Streams adalah abstraksi dari sesuatu yang digunakan untuk menulis/menghasilkan dan membaca/mendapatkan suatu informasi. Semua streams memiliki sifat yang sama walaupun peralatan fisik yang berhubungan dengan suatu stream berbeda-beda. 2 Pengenalan Streams Secara umum streams dalam Java dibagi dalam 2 bagian besar : Byte Streams digunakan untuk operasi I/O yang menggunakan data biner (byte) Character Stremas digunakan untuk menangani operasi I/O yang menggunakan character. byte streams character streams Karakter dalam java menggunakan Unicode, sehingga penggunaan character streams dapat digunakan untuk menangani karakterkarakter internasional (karakter diluar kode ASCII Standar) Semua class & interface yang berhubungan dengan streams ada dalam package java.io. 3 Byte Streams Byte stream diperkenalkan oleh Java sejak JDK 1.0 Stream ini digunakan untuk menulis & membaca data biner Untuk byte streams, Java menyediakan dua class abstrak yang merupakan superclass tertinggi yaitu : InputStream untuk membaca input OutputStream untuk menuliskan output 4 Character Streams Character stream diperkenalkan oleh Java sejak JDK 1.1 Stream ini digunakan untuk menulis & membaca data yang berupa character. Untuk character streams, Java menyediakan dua class abstrak yang merupakan superclass tertinggi yaitu : Reader untuk membaca input Writer untuk menuliskan output 5 Variabel Streams Standar Secara default, Java telah menyediakan 3 buah variabel streams yang dapat langsung digunakan, karena variabel ini member public static dari class System, yaitu : in,out,err. System.out : output stream standar. Secara default outputnya adalah console. System.in : input stream standar. Secara default inputya adalah keyboard. System.err : output stream untuk mencetak pesan kesalahan pada console (default). 6 Membaca Input dari Console menggunakan Byte Streams Untuk membaca dari console digunakan variabel stream standar yang telah disediakan oleh class System, yaitu in. Variabel ini memegang referensi dari objek dengan tipe InputStream sehingga untuk membaca dari console (yang diketik lewat keyboard), dapat menggunakan method read 7 Membaca Input dari Console menggunakan Byte Streams Contoh 1 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. import java.io.*; public class DemoStream1 { public static void main(String[] args) { byte[] data = new byte[10]; System.out.print("Masukkan data : "); try { System.in.read(data); } catch (IOException e) { System.out.print("Terjadi Exception"); } System.out.print("Yang anda ketik : "); for (int i=0;i<data.length;i++) { System.out.print((char)data[i]); } } } 8 Membaca Input dari Console menggunakan Byte Streams Contoh 2 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. import java.io.*; public class DemoStream2 { public static void main(String[] args) { byte[] data = new byte[10]; int panjang=0; System.out.print("Masukkan data : "); try { panjang=System.in.read(data); } catch (IOException e) { System.out.print("Terjadi Exception"); } System.out.println("Yang anda ketik : "); for (int i=0;i<panjang;i++) { System.out.print((char)data[i]); } System.out.println("Panjang Karakter : "+panjang); } } 9 Menulis Output ke Console menggunakan Byte Streams Untuk menulis ke console digunakan variabel stream standar yang telah disediakan oleh class System, yaitu out. Variabel ini memegang referensi dari objek dengan tipe PrintStream. PrintStream merupakan turunan dari class OutputStream. Method yang biasa digunakan : print(),println(),write(). 10 Menulis Output ke Console menggunakan Byte Streams Contoh 3 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. import java.io.*; public class DemoStream3 { public static void main(String[] args) { byte[] data = new byte[10]; int panjang=0; System.out.print("Masukkan data : "); try { panjang=System.in.read(data); System.out.print("Yang anda ketik : "); System.out.write(data); System.out.println("Panjang Karakter : "+panjang); System.out.print("index ke-1 sebnyk 3 : "); System.out.write(data,1,3); } catch (IOException e) { System.out.print("Terjadi Exception"); } 18. } 19. 20. } 11 Membaca Input dari File Untuk membaca dari file dengan menggunakan byte stream,dapat digunakan class FileInputStream. Deklarasi konstruktornya : FileInputStream(File file) throws FileNotFoundException FileInputStream (String name) throws FileNotFoundException 12 Membaca Input dari File Contoh 4 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. import java.io.*; public class DemoStream4 { public static void main(String[] args) { byte data; String namaFile = "test.txt"; FileInputStream fin = null; try { fin = new FileInputStream(namaFile); data = (byte)fin.read(); while (data!=-1) { System.out.print((char)data); data = (byte)fin.read(); } } catch (FileNotFoundException e) { System.out.println("File "+namaFile+" tidak ditemukan"); } catch (IOException e) { System.out.println("Terjadi Exception"); } 13 Membaca Input dari File Contoh 4 (lanjutan) : finally { if (fin!=null) { try { fin.close(); } catch (IOException e) { System.out.println("Terjadi Exception"); } } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. } 11. 12. } 14 Menulis Output ke File Untuk menulis ke file dengan menggunakan byte stream,dapat digunakan class FileOutputStream. Deklarasi konstruktornya : FileOutputStream(String name) throws FileNotFoundException FileOutputStream(String name,boolean append) throws FileNotFoundException FileOutputStream(File file) throws FileNotFoundException FileOutputStream(File file,boolean append) throws FileNotFoundException 15 Menulis Output ke File Contoh 5 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. import java.io.*; public class DemoStream5 { public static void main(String[] args) { byte data; String namaFile = "test.txt"; FileOutputStream fout = null; try { fout = new FileOutputStream(namaFile); System.out.println("Ketik : "); data = (byte)System.in.read(); while (data!=(byte)'\r') { fout.write(data); data = (byte)System.in.read(); } } catch (FileNotFoundException e) { System.out.println("File "+namaFile+" tidak dapat dicreate"); } catch (IOException e) { System.out.println("Terjadi Exception"); } 16 Menulis Output ke File Contoh 5 (lanjutan) : finally { if (fout!=null) { try { fout.close(); } catch (IOException e) { System.out.println("Terjadi Exception"); } } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. } 11. 12. } 17 Membaca Input dari Console menggunakan Character Streams Setiap karakter di Java = 16 bit. Masalah : System.in beroperasi menggunakan byte stream (8 bit) Bagaimana caranya menggunakan System.ini pada character streams? Solusi : Bungkus System.in dengan class InputStreamReader yang dapat mengkonversi byte streams ke character streams Deklarasi konstruktor nya : InputStreamReader (Input Stream in) 18 Membaca Input dari Console menggunakan Character Streams Masalah lain : byte streams (8 bit) ukurannya lebih kecil dari char (16bit). Bagaimana mengkonversi dari byte streams menjadi char streams dengan benar? Solusi : input stream sebaiknya dibaca dari buffer, bukan dari peralatan fisik langsung. Untuk bungkus objek dari InputStreamReader ke dalam class BufferedReader. Deklarasi konstruktornya : BufferedReader (Reader in) 19 Membaca Input dari Console menggunakan Character Streams Jadi jika ingin membaca dari console dengan Character Streams, dapat ditulis dengan cara : InputStreamReader input = new InputStreamReader(System.in); BufferedReader buff = new BufferedReader(input); Atau dengan cara : BufferedReader buff = new BufferedReader( new InputStreamReader(System.in)); 20 Membaca Input dari Console menggunakan Character Streams Untuk membaca character streams, dapat menggunakan method : int read() throws IOException int read(char[] cbuf) throws IOException int read(char[] cbuf,int off,int len) throws IOException String readLine() throws IOException 21 Membaca Input dari Console menggunakan Character Streams Contoh 6 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. import java.io.*; public class DemoStream6 { public static void main(String[] args) throws IOException { char data; String str=""; BufferedReader buff = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ketik : "); data = (char) buff.read(); while (data!='\r') { str+=data; data = (char) buff.read(); } System.out.println("Yang diketik : "+str); System.out.println("Program Selesai"); } } 22 Membaca Input dari Console menggunakan Character Streams Contoh 7 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. import java.io.*; public class DemoStream7 { public static void main(String[] args) throws IOException { String str; String hasil=""; BufferedReader buff = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ketik (akhiri dengan EXIT) : "); str = buff.readLine(); while (!str.equals("EXIT")) { hasil+=str+'\n'; str = buff.readLine(); } System.out.println("Yang diketik : "+hasil); System.out.println("Program Selesai"); } } 23 Menulis Output ke Console menggunakan Character Streams Untuk menulis output ke console dengan Character Streams, adalah dengan cara membungkus System.out dengan object output stream yang mendukung character streams. Dalam hal ini gunakan class PrintWriter Deklarasi konstruktornya : PrintWriter (OutputStream out); PrintWriter (OutputStream out,Boolean autoFlush); Contoh : PrintWriter output = new PrintWriter (System.out,true); 24 Menulis Output ke Console menggunakan Character Streams Contoh 8 : 1. 2. 3. 4. 5. 6. 7. import java.io.*; public class DemoStream8 { public static void main(String[] args) throws IOException { PrintWriter output = new PrintWriter (System.out,true); output.println("Hello World"); } } 25 Membaca Input dari File menggunakan Character Streams Untuk membaca input dari File dengan character streams, gunakan : FileReader (String fileName) throws FileNotFoundException 26 Membaca Input dari File menggunakan Character Streams Contoh 9 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. import java.io.*; public class DemoStream9 { public static void main(String[] args) { String data; String namaFile = "test.txt"; FileReader fin = null; try { fin = new FileReader(namaFile); BufferedReader buff = new BufferedReader(fin); data = buff.readLine(); while (data!=null) { System.out.print(data); data = buff.readLine(); } } catch (FileNotFoundException e) { System.out.println("File "+namaFile+" tidak ditemukan"); } catch (IOException e) { System.out.println("Terjadi Exception"); } 27 Membaca Input dari File menggunakan Character Streams Contoh 9 (lanjutan): finally { if (fin!=null) { try { fin.close(); } catch (IOException e) { System.out.println("Terjadi Exception"); } } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. } 11. 12. } 28 Menulis Output ke File menggunakan Character Streams Untuk menulis ke file dengan menggunakan character stream,dapat digunakan class FileWriter. Deklarasi konstruktornya : FileWriter(String fileName) throws FileNotFoundException FileWriter(String fileName, boolean append) throws FileNotFoundException FileWriter(File file) throws FileNotFoundException FileWriter(File file,boolean append) throws FileNotFoundException 29 Menulis Output ke File menggunakan Character Streams Contoh 10 : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. import java.io.*; public class DemoStream10 { public static void main(String[] args) { String data; String namaFile = "test.txt"; FileWriter fout = null; BufferedReader buff = new BufferedReader(new InputStreamReader(System.in)); try { fout = new FileWriter(namaFile); System.out.println("Ketik : "); data = buff.readLine(); while (!data.equals("EXIT")) { fout.write(data+"\r\n"); data = buff.readLine(); } } 30 Menulis Output ke File menggunakan Character Streams Contoh 10 : catch (FileNotFoundException e) { System.out.println("File "+namaFile+" tidak dapat dicreate"); } catch (IOException e) { System.out.println("Terjadi Exception"); } finally { if (fout!=null) { try { fout.close(); } catch (IOException e) { System.out.println("Terjadi Exception"); } } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. } 17. 18. } 31