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
Input atau Stream Sumber
- Dari stream ini dapat
membaca
- Superclass dari semua
input streams:
* Class
InputStream
* Class
Reader
Output
- Kita dapat menulis pada
stream ini
- Class root dari stream
ini:
* Class
OutputStream
* Class
Writer
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
Package
java.io
• Package
java.io berisi kelas yang berhubungan dengan I/O di Java
• Dibagi menjadi
beberapa kelas
– Reader/Writer dan
turunannya
–
InputStream/OutputStream dan turunannya
– I/O Network (socket TCP/IP)
–
Exception
2. Kelas Abstrak pada java.io
• Ada 4 kelas abstrak
dasar
–
Reader
–
Writer
–
InputStream
–
OutputStream
•
Reader dan Writer digunakan untuk data Teks
• InputStream dan OutputStream
digunakan untuk data biner
3.
Kelas Reader/Writer
• Kelas Reader/Writer bekerja
pada stream teks (bahasa apapun)
• Disebut juga character
stream
•
Menangani konversi teks Unicode secara otomatis
• Jangan dipertukarkan dengan
InputStream/OutputStream secara sembarangan
• Hasilnya bisa
error
Kelas InputStream/OutputStream
• InputStream dan OutputStream
digunakan untuk mengakses informasi non teks (biner)
– disebut juga sebagai byte
stream
–
COntoh data biner: File EXE, file GIF
• InputStream/OutputStream
Tidak menangani konversi teks Unicode secara otomatis
Diagram Kelas InputStream dan turunannya
4. Input dan Output File
• Gunakan FileInputStream dan
FileOutputStream untuk membaca/menulis file non teks
• Gunakan
FileReader/FileWriter untuk file teks
Contoh Membuka
file untuk dibaca
• 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
Contoh Membuka
file untuk ditulis
• 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
Perhatikan:
• 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
Memakai
FileReader/FileWriter
• Sama seperti contoh
sebelumnya
–
Ganti nama kelas FileInputStream
dengan FileReader dan
FileOutputStream
dengan
FileWriter
–
Tetap gunakan read/write
• Perhatikan
bahwa
– Nilai
kembalian
5. Wrapper• Stream dapat dikomposisi atau difilter atau dibungkus
untuk menghasilkan stream yang lebih kompleks
• 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
Contoh Wrapper:
BufferedReader
• 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()
Contoh Wrapper:
PrintWriter
• 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
Membaca dari Console [1]
• 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
Membaca dari console [2]
• 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()
NIO (Nonblocking I/O)
• JDK 1.4 (nama Kode:
Merlin) ke atas menyediakan NIO
– Ada di package java.nio
•
Improvement:
– Non blocking I/O
– Buffer
– Regular
Expression
[2] String dan StringBuffer
*String
• Merupakan kelas khusus di Java
(ditangani secara transparan)
• Sifatnya immutable (tidak bisa diubah)
•
Memiliki berbagai method untuk memiliki manipulasi String
*Literal String
• Harap diingat lagi bahwa:
–
Setiap Literal String adalah sebuah objek
String. Contoh:
String teks =
“Hello”;
System.out.println(teks.length());
– Sama
dengan
System.out.println(“Hello”.length());
*Sifat Immutable String
• 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");
*Operasi String Tidak Optimal
• 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
• 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.
*Sifat mutable StringBuffer
• 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)
*Method yang penting
• 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
*Membandingkan String
• 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
[3] Kelas Matematik
*Matematika di Java
• 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 )
*Memformat Hasil
• 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)
*Beberapa fungsi matematika yang penting
• 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
• 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 dan BigDecimal
• 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
[4] Utility
*Utility
• 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
*Hashtable
• 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
*Contoh
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);
}
}
}
*Stack
• 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()
*Contoh 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());
}
}
}
*Vector
• 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)
*Contoh Vector
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));
}
}
}
*Calendar
•
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
*Contoh
Calendar
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");
}}
CONTOH PENERAPAN
package testjeni_02;
import
java.io.*;
/**
*
* @author NieNov
*/
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.");
}
}
}