Pengertian I/O Stream
I/O -> adalah singkatan dari Input / Output dan mengacu pada transfer data ke atau dari aplikasi.
Stream -> Keadaan dari sebuah file atau sebuah device yang memungkinkan rangkaian item dapat dibaca atau ditulis
Overview I/O
1. Konsep Stream
2. Kelas Abstrak pada java.io
3. Reader/Writer
4. Input dan Output file
5. Wrapper
1. Konsep Stream
• Stream adalah suatu abstraksi untuk data input dan output.
– Tidak peduli dari mana input berasal atau kemana output akan pergi
• Dibagi menjadi beberapa kelas
– InputStream/OutputStream dan turunannya
– I/O Network (socket TCP/IP)
– Exception
– Reader
– Writer
– InputStream
– OutputStream
• Reader dan Writer digunakan untuk data Teks
• InputStream dan OutputStream digunakan untuk data biner
• Disebut juga character stream
• Menangani konversi teks Unicode secara otomatis
• Jangan dipertukarkan dengan InputStream/OutputStream secara sembarangan
• Hasilnya bisa error
– disebut juga sebagai byte stream
– COntoh data biner: File EXE, file GIF
• InputStream/OutputStream Tidak menangani konversi teks Unicode secara otomatis
• Gunakan FileReader/FileWriter untuk file teks
• cara untuk membuka file (untuk dibaca):
FileInputStream s = new
FileInputStream(“test.dat”);
• Cara untuk membaca satu byte: int a = s.read()
• Tersedia juga method untuk membaca array of byte
• Prototype read adalah : int read()
– Perlu dicast ke byte untuk membaca sebagai byte
– Memakai int supaya cukup merepresentasikan -1
• Cara untuk membuka file (untuk ditulisi):
FileOutputStream out = new
FileOutputStream(“test.out”);
• Intruksi untuk menulis satu byte:
– Out.write(‘a’)
• Tersedia juga method untuk menulis array of byte
• Membaca dan menulis selalu perlu try … catch
• Method read() dan write() melempar Exception java.lang.IOException
• Kasus khusus: read() mengembalikan
-1 pada end of file
• EOF (End Of File atau EndOfStream) tidak menimbulkan exception
• Sama seperti contoh sebelumnya
– Ganti nama kelas FileInputStream
dengan FileReader dan FileOutputStream
dengan FileWriter
– Tetap gunakan read/write
• Perhatikan bahwa
– Nilai kembalian
• Konsep ini mirip dengan pipe di
Unix/Windows
• Contoh:
– BufferedReader yang menyediakan readLine()
– PipedWriter/PipedReader untuk mempipe suatu stream
– PrintStream/PrintWriter untuk menulis ke stream dengan mudah
• Perhatikan potongan kode berikut:
BufferedReader br = new
BufferedReader(new
FileReader(“hello.txt”));
//membaca 1 baris
String teks = br.readLine();
• BufferedReader membungkus (wraps) FileReader untuk menyediakan method readLine()
• Perhatikan potongan kode berikut:
PrintWriter pr = new PrintWriter(new FileWriter(“hello.txt”)); //Menulis 1 baris pr.println(“Hello “);
• PrintWriter membungkus (wraps) FileWriter untuk menyediakan method print(), println() untuk semua tipe data dasar
• Java menyediakan System.in yang class-nya adalah InputStream
• Membaca teks dari console
• Untuk membaca teks, perlu di-wrap dengan BufferedReader
• Tapi BufferedReader hanya bisa mewrap suatu class turunan Reader
• InputStream perlu di-wrap dengan InputStreamReader
• Buat BufferedReader yangmembungkus InputStreamReader yang membungkus System.in
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in))
• Untuk membaca:
String s = br.readLine();
• Untuk membaca integer, teks dibaca dengan method yang sama, lalu dikonversi dengan method Integer.parseInt()
• JDK 1.4 (nama Kode: Merlin) ke atas menyediakan NIO
– Ada di package java.nio
• Improvement:
– Non blocking I/O
– Buffer
– Regular Expression
• Merupakan kelas khusus di Java (ditangani secara transparan)
• Sifatnya immutable (tidak bisa diubah)
• Memiliki berbagai method untuk memiliki manipulasi String
• Harap diingat lagi bahwa:
– Setiap Literal String adalah sebuah objek
String. Contoh:
String teks = “Hello”; System.out.println(teks.length());
– Sama dengan
" 2="[/java" language="["]
• String sebenarnya tidak dapat diubah, namun Java memungkinkan String seolah-olah diubah, Contoh:
– Jika dilakukan ini:
String judul = "Judul :"; judul += "Eyes On Me";
– Maka sebenarnya yang dilakukan adalah ini
String judul = "Judul :"; judul = judul.concat("Eyes On Me");
• String baru diciptakan (string yang lama tetap ada di memori, dan dibuang ketika terjadi garbage collection)
• Untuk operasi yang banyak melibatkan perubahan string, sebaiknya menggunakan StringBuffer
• StringBuffer mirip dengan String
• Sifatnya mutable
• Tidak ditangani secara transparan oleh Java (harus dilakukan secara manual)
• Lebih cepat untuk manipulasi string yang memerlukan perubahan pada String.
• Untuk mengubah StringBuffer tidak perlu objek baru
– Contoh :
StringBuffer nama = new StringBuffer("mataku"); nama.setCharAt(4, 'm');
• Untuk mengubah String selalu butuh objek baru (objek lama diubah melalui assignment)
• Beberapa method String dan StringBuffer yang penting adalah:
– length(): panjang string
– replace(): mengganti suatu karakter
– charAt(): mengakses karakter di posisi tertentu
– trim(): menghilangkan spasi di awal dan di akhir string
• Perhatikan bahwa meskipun namanya sama, sifat keduanya berbeda
– String menciptakan objek baru, sedangkan StringBuffer tidak
• Method equals() membandingkan string untuk memeriksa kesamaan
• Method equalsIngnoreCase() melakukan hal yang sama, tapi besar kecil huruf tidak diperhatikan
• Method compareTo() menghasilkan 0 jika string sama, >0 jika String1>String2 dan <0 jika String1<String2
• Fungsi matematika ada di package java.math
• Meliputi fungsi trigonometri, dan fungsi matematika standar
– Berisi juga konstanta penting (seperti PI dan e)
– Sebagian besar hasil method adalah bilangan riil (tipenya double )
• Class math tidak menyediakan cara untuk memformat keluaran (output) sehingga dapat dicetak dengan rapi
• Perlu class DecimalFormat untuk melakukan format terhadap output (DecimalFormat ada pada package java.text)
• Method pow() untuk pangkat
• Fungsi-fungsi trigonometri (sin, cos, tan)
• Pembulatan hasil, meliputi
– ke atas : ceil, ke bawah: floor, dan terdekat : round
• Logaritma
• Bilangan acak sangat penting dalam simulasi, permainan, dan enkripsi
• Bilangan acak dihasilkan dengan kelas Random
• Kelas Random tidak berada dalam package java.math, tapi dalam kelas java.util
– Contoh:
Random r = new Random(); int x = r.nextInt(10); //random 0..9
• BigInteger
– Integer presisi tak hingga
– Berisi semua method untuk operasi integer dan bahkan method untuk mengecek probabilitas suatu bilangan adalah prima
• BigDecimal
– Bilangan floating point presisi tak hingga
– Semua method untuk doube/float
• Berbagai macam kelas yang tidak cocokdimasukkan ke package tertentu
• Beberapa yang akan dibahas
– Hashtable
– Stack
– Vector
– Calendar
• Kelas lain yang cukup berguna untukdipelajari: List, Tree
• Digunakan untuk menyimpan data dengan assosiasi tertentu
– Misal nama panggilan diassosiasikan dengan nama lengkap
• Memetakan suatu nilai String dengan suatu Objek tertentu (Objek apa saja, termasuk juga Objek String)
• Method yang dipakai adalah put dan get
import java.util.Hashtable; class HashtableDemo { public static void main(String argv[]) { Hashtable h = new Hashtable(); h.put("Linux", "Torvalds"); h.put("Windows", "Microsoft"); String nama = (String) h.get("Linux"); if (nama!=null) { System.out.println(nama); } } }
• Struktur data LIFO (Last In First Out)
– Data yang masuk pertama akan keluar terakhir
• Memakai Method push, untuk meletakkan satu item di Stack dan pop untuk mengeluarkan satu item dari stack
– Ada juga method peek() untuk mengintip top of stack dan search untuk mencari elemen di Stack()
import java.util.Stack; class StackDemo { public static void main(String argv[]) { Stack s = new Stack(); s.push("Salamku Kawan"); s.push("Jangan Takut Gelap"); s.push("Gembira berkumpul"); while (!s.empty()) { System.out.println(s.pop()); } } }
• Struktur data seperti array
• Sifatnya dinamis (ukurannya tidak tetap), berubah sesuai dengan elemen yang ditambahkan ke (atau dihapus dari)
Vector tersebut
• Dapat dimanipulasi dengan mudah (elemen-elemennya dapat di add, remove, atau diubah dengan mudah)
import java.util.Vector; import java.util.Enumeration; class VectorDemo { public static void main(String argv[]) { Vector v = new Vector(); /* tambahkan elemen */ v.add("Pelangiku"); v.add("Andai Aku Besar Nanti"); v.add("Dua Balerina"); for (int i=0; i<v.size(); i++){ System.out.println(" - " + v.elementAt(i)); } } }
• Dipakai untuk menangani perhitungan kalender Masehi (Gregorian)
– Dirancang untuk mendukung kalender lain
• Menyediakan informasi mengenai tanggal, (date) dan waktu (time) saat ini (misalnya hari apa, bulan ke berapa, hari keberapa dalam tahun ini)
• Menyediakan sarana untuk penghitungan waktu
import java.util.Calendar; class Kalender { public static void main(String argv[]) { Calendar c = Calendar.getInstance(); System.out.println("Hari ini :"); System.out.println("Hari ke“ +c.get(Calendar.DAY_OF_WEEK)+" dalam minggu ini"); }}
package testjeni_02;
import java.io.*; public class FileInfoClass { public static void main(String args[]) { String fileName = "C://Price Tag.txt"; File fn = new File(fileName); System.out.println("Name: " + fn.getName()); if (!fn.exists()) { System.out.println(fileName + " does not exists."); /* membuat sebuah temporary directory . */ System.out.println("Creating temp directory..."); fileName = "temp"; fn = new File(fileName); fn.mkdir(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); System.out.println("Deleting temp directory..."); fn.delete(); System.out.println(fileName + (fn.exists()? "exists": "does not exist")); return; } System.out.println(fileName + " is a " + (fn.isFile()? "file." :"directory.")); if (fn.isDirectory()) { String content[] = fn.list(); System.out.println("The content of this directory:"); for (int i = 0; i < content.length; i++) { System.out.println(content[i]); } } if (!fn.canRead()) { System.out.println(fileName + " is not readable."); return; } System.out.println(fileName + " is " + fn.length() + " bytes long."); System.out.println(fileName + " is " + fn.lastModified() + " bytes long."); if (!fn.canWrite()) { System.out.println(fileName + " is not writable."); } } }
sumber :