Rabu, 01 Desember 2010

Stream I/O Lanjut

Tujuan

Dalam module sebelumnya, Anda telah mempelajari bagaimana untuk mendapatkan
input user dan memanipulasi file-file menggunakan strea. Kini Anda akan mempelajari
lebih banyak tentang stream dan class-class stream yang lain.
Pada akhir pembahasan, diharapkan pembaca dapat :
1. Tahu tipe-tipe stream yang umum digunakan
2. Menggunakan class File dan methodnya
 Karakter dan Stream byte
 Input dan Output Streams
 Node dan Filter Streams
3. Menggunakan class-class Input/Output yang berbeda
 Reader
 Writer
 InputStream
 OutputStream
4. Memahami konsep dari stream chaining
5. Mendefinisikan serialisasi
6. Memahami penggunaan dari kata kunci transient
7. Menulis dan membaca dari sebuah object stream

Tipe-Tipe Stream yang Umum Digunakan

Stream Karakter dan Byte

Seperti yang telah disebutkan sebelumnya, secara umum ada dua tipe dari stream, yaitu
stream karakter dan byte. Kita hanya mengulang perbedaan mendasar antara
keduanya. Stream byte adalah abstraksi file atau alat untuk data biner sedangkan
stream karakter adalah untuk karakter Unicode.
Class InputStream adalah abstraksi class root untuk semua input stream byte sedangkan
class OutputStream adalah class root abstraksi dari semua output stream byte. Untuk
stream karakter, superclasss yang sesuai dari semua class-class secara berturut-turut
adalah class Reader dan the Writer. Kedua class-class ini adalah abstraksi class-class
untuk membaca dan menulis stream karakter.

Input dan Output Stream

Stream juga dikategorikan berdasarkan apakah mereka digunakan untuk membaca atau
menulis stream. Walaupun ini sudah cukup nyata, Anda diperbolehkan untuk membaca
dari input stream tapi tidak menulisnya. Di lain pihak, Anda diperbolehkan untuk menulis
output streams tapi tidak membacanya.

Class InputStream dan class Reader adalah superclass-superclass dari semua input
stream. Class OutputStream dan class Writer adalah class-class root dari semua output
stream.

Input stream juga dikenal sebagai stream sumber (source stream) sejak kita
memperoleh informasi dari stream ini. sementara itu output stream disebut juga stream
hasil(sink stream).

Node dan Stream Filter

Kini package java.io membedakan antara node dan stream filter. Sebuah stream node
adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari
sebuah lokasi khusus seperti pada disk atau dari jaringan. Tipe-tipe dari stream node
terdiri atas file, memory dan jalur data. Stream filter, di lain pihak, diletakkan pada layer
stream node diantara threads atau proses untuk menyediakan fungsi tambahan yang
tidak dapat ditemukan dalam stream node oleh stream node itu sendiri. Penambahan
lapisan pada sebuah stream node disebut dengan stream chaining.

Sesi ini berturut-turut mempunyai sebuah tujuan dari class-class stream yang berbeda.
Untuk melengkapi daftar dari class-class ini, lihatlah pada dokumentasi Java's API.

Class File

Walaupun class File bukan merupakan class stream, ini sesuatu yag penting bahwa kita
mempelajari ini sejak class-class stream merupakan file-file yang telah dimanipulasi.
Class adalah sebuah perwakilan dari abstraksi dari file-file nyata dan nama path
direktori.

Untuk meng-instantiate sebuah object File, Anda dapat menggunakan constructor
berikut ini:
Sebuah Constructor File

File(String pathname)

Instantiate sebuah object File dengan nama path khusus sebagai nama filenya. Nama
filenya mungkin salah satu menjadi penuh( sebagai contoh, isi dengan path yang
lengkap) atau mungkin terdiri atas namafile itu sendiri dan diasumsikan menjadi diisi
dalam direktori tersebut.

Class File menyediakan beberapa method untuk memanipulasi file dan direktori. Berikut
ini beberapa dari method-method tersebut.

Method-method File

public String getName(
)

Mengembalikan nilai nama file atau nama direktori dari object File ini.

public boolean exists()

Menguji apakah sebuah file atau sebuah direktori masih ada atau tidak

public long length()

Mengembalikan nilai ukuran dari file.

public long lastModified()

Mengembalikan nilai tanggal dalam milidetik ketika file terakhir kali dimodifikasi.

public boolean canRead()

Mengembalikan nilai true jika dijinkan untuk membaca dari file. Sebaliknya, nilai
pengembaliannya bernilai false.

public boolean canWrite()

mengembalikan nilai true jika diijinkan untuk menulis ke sebuah file. Sebaliknya, nilai
pengembaliannya bernilai false.

public boolean isFile()

Menguji apakah object ini berupa sebuah file, yaitu persepsi normal kita tentang apa itu
sebuah file (bukan sebuah direktori) atau bukan.

public boolean isDirectory()

menguji apakah object ini adalah sebuah direktori atau bukan.

public String[] list()

Method-method File

Mengembalikan nilai daftar file dan subdirektori yang ada dalam object ini. Object ini
haruslah berupa sebuah direktori.

public void mkdir()

Membuat sebuah direktori yang merupakan abstraksi nama path ini.

public void delete()

Membuang file atau direktori yang sebenarnya diwakili oleh object File tersebut.

Mari kita melihat bagaimana method ini bekerja berdasarkan contoh berikut ini :

import java.io.*;

public class FileInfoClass {
public static void main(String args[]) {
String fileName = args[0];
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 <>
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.");
}
}
}

Class Reader

Bagian ini menggambarkan stream karakter yang digunakan untuk membaca.

Method Reader

Class Reader terdiri atas beberapa method untuk membaca karakter. berikut ini adalah
beberapa method class :

Method Reader

public int read(-) throws IOException

Sebuah method overload, yang mana memiliki tiga versi. Membaca karakter, segala
karakter array atau sebuah porsi untuk sebuah karakter array.

public int read() - membaca sebuah karakter tunggal.

public int read(char[] cbuf)- Membaca karakter dan menyimpannya dalam
karakter array cbuf.

public abstract int read(char[] cbuf, int offset, int length)- Membaca karakter sejumlah panjang karakter tertentu dan menyimpannya dalam karakter cbuf
dimulai pada tanda offset khusus yang telah ditentukan.

public abstract void close() throws IOException

Menutup Stream ini. Memanggil method Reader yang lain setelah menutup stream akan
menyebabkan suatu IOException dijalankan.

public void mark(int readAheadLimit) throws IOException

Menandai posisi tertentu pada stream. Setelah menandai, panggil untuk melakukan
reset() kemudian stream akan mencoba mengatur posisinya kembali pada titik ini.
Tidak semua stream input karakter mendukung operasi ini.

public boolean markSupported()

mengindikasikan apakah sebuah stream mendukung operasi pemberian tanda (mark)
atau tidak Tidak didukung oleh default. Seharusnya bersifat overid subclass.

public void reset() throws IOException

Reposisi stream ke posisi akhir stream yang telah ditandai

Class Node Reader

Berikut ini adalah beberapa dasar class Reader:

Class-class Node Reader
FileReader

Untuk membaca file-file karakter.

CharArrayReader

Mengimplementasikan suatu karakter buffer yang dapat dibaca.

StringReader

Untuk membaca dari sebuah sumber string.

PipedReader

Digunakan untuk pasangan (dengan sebuah PipedWriter yang sesuai) oleh dua urutan
yang ingin berkomunikasi. Salah satu dari urutan tersebut membaca karakter dari
sumber tertentu.

Class-Class Filter Reader

Untuk menambah fungsi ke class-class dasar Reader, Anda dapat menggunakan class
stream filter. Berikut ini adalah beberapa dari class-class tersebut :

Class-Class Filter Reader

BufferedReader

mengizinkan penyimpanan sementara karakteryang bertujuan untuk menyediakan
fasilitas pembacaan karakter, arrays, dan bais yang lebih efisien.

FilterReader

Untuk membaca stream karakter yang telah terfilter.

InputStreamReader

Menkonversi pembacaan byte ke bentuk karakter.

LineNumberReader

Sebuah subclass dari class BufferedReader yang dapat menjaga memori penyimpanan
untuk nomor baris.

PushbackReader

Sebuah subclass dari class FilterReader yang memungkinkan karakter dikembalikan
atau tidak terbaca oleh stream.

Class-Class Writer

Pada pembahasan ini menjelaskan tentang stream karakter yang digunakan untuk
menulis.

Writer Method

Class Writer terdiri atas beberapa method untuk menulis karakter. Berikut ini adalah
beberapa method class :

Method Writer

public void write(-) throws IOException

Sebuah method overloading dalam lima versi:

public void write(int c) Menulis sebuah karakter tunggal yang diwakili oleh
pemberian nilai integer.

public void write(char[] cbuf) Menulis isi dari karakter array cbuf.

public abstract void write(char[] cbuf, int offset, int length) – Menulis
sejumlah length karakter dari aaray cbuf, dimulai pada offset tertentu.

public void write(String str) – Menulis string string.

public void write(String str, int offset, int length) – Menulis sejumlah
length karakter dari string str, dimulai pada offset tertentu.

public abstract void close() throws IOException

Menutup stream ini setelah flushing beberapa karaktr yang tidak tertulis. Invocation
method lain setelah menutup stream ini akan menyebabkan terjadinya IOException.

public abstract void flush()

Mengganti stream(yaitu karakter yang disimpan dalam buffer dengan segera ditulis ke
tujuan yang dimaksud).

Node Writer Classes

Berikut ini beberapa dasar class Writer:

Node Writer Classes
FileWriter

Untuk menulis karakter ke sebuah file.

CharArrayWriter

Menggunakan karakter penyangga yang dapat dituliskan juga.

StringWriter

Untuk menulis source string

PipedWriter

Node Writer Classes

Digunakan dengan berpasangan(dengan menghubungkan PipedReader) oleh dua thread yang ingin berkomunikasi. Satu dari thread ini menulis karakter ke stream ini.

Filter Writer Classes
Untuk menambah fungsionalitas ke dasar class Writer, Anda dapat menggunakan class stream filter.Terdapat beberapa class-class:

Filter Writer Classes

BufferedWriter

Menyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan karakter, array, dan garis.

FilterWriter

Untuk menulis stream karakter yang difilter.

OutputStreamWriter

Mengkodekan karakter yang ditulis ke dalam byte.

PrintWriter

Mencetak representasi yang diformat dari object ke dala stream text-output.

Contoh Dasar Reader/Writer

Contoh penggantian menggunakan class FileReader dan FileWriter. Dalam contoh ini, program membaca dari file yang khusus oleh user dan mengkopi isi dari file ke file lain.

import java.io.*;
class CopyFile {
void copy(String input, String output) {
FileReader reader;
FileWriter writer;
int data;
try {
reader = new FileReader(input);
writer = new FileWriter(output);
while ((data = reader.read()) != -1) {
writer.write(data);
}
reader.close();
writer.close();
} catch (IOException ie) {
ie.printStackTrace();
}

}
public static void main(String args[]) {
String inputFile = args[0];
String outputFile = args[1];
CopyFile cf = new CopyFile();
cf.copy(inputFile, outputFile);
}
}

Cobalah program tersebut sendiri dan amatilah apa ang terjadi pada file yang dimanipulasi.

Merubah Contoh Reader/Writer

Contoh pengganti hampir sama dengan contoh sebelumnya tetapi lebih efisien.
Walaupun membaca dan menulis ke stream sekali saja, karakter membaca yang
pertama disimpan dalam buffer sebelum penulisan karakter baris per baris. Program
menggunakan teknik dari perangkaian stream dimana clas FileReader dan FileWriter
didekorasi dengan class BufferedReader dan BufferedWriter, berurutan.

import java.io.*;
class CopyFile {
void copy(String input, String output) {
BufferedReader reader;
BufferedWriter writer;
String data;
try {
reader = new BufferedReader(new FileReader(input));
writer = new BufferedWriter(new FileWriter(output));
while ((data = reader.readLine()) != null) {
writer.write(data, 0, data.length());
}
reader.close();
writer.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
public static void main(String args[]) {
String inputFile = args[0];
String outputFile = args[1];
CopyFile cf = new CopyFile();
cf.copy(inputFile, outputFile);
}
}

Bandingkan kode ini dengan sebelumnya. Apakah hasil dari menjalankan program ini?


Serialisasi

Java Virtual Machine (JVM) mendukung kemampuan untuk membaca atau menulis
sebuah object ke bentuk stream. kemampuan ini disebut dengan serialisasi, proses
"flattening" sebuah object sehingga data tersebut dapat disimpan ke beberapa
penyimpanan permanen atau dilewatkan ke object lain melalui class OutputStream.
Ketika menulis sebuah object, ini merupakan hal yang penting bahwa keadaan tersebut
sudah tertulis dan telah diserialisasi dari setiap objectnya dapat dibangun kembali
sebagaimana dtaa tersebut dibaca. Menyimpan sebuah objectke beberapa tipe
penyimpanan permanen yang dikenal sebagai persistence.
Stream yang digunakan untuk deserialisasi dan serialisasi secara berurutan adalah class
ObjectInputStream dan ObjectOutputStream .
Untuk memungkinkan sebuah object diserialisasi (sebagai contoh dapat disimpan dan
diurutkan), Class tersebut harus mengimplementasikan interface yang dapat
diserialisasi. Class ini seharusnya juga menyediakan default constructor atau sebuah
constructor tanpa argumen. Satu hal yang baik mengenai kemampuan untuk melakukan
serialisasiyang dapat diturunkan, yang berarti kita tidak memiliki implementasi
serialisasi pada setiap class. Ini berarti mengurangi pekrjaan untuk programmer. Anda
hanya dapat mengimplementasikan serialisasi sekali sepanjang hirarki class.

Kata Kunci transient

Ketika suatu object diserialisasi, tempat hanya disediakan untuk data object. Method dan
Constructor bukan merupakan bagian dari stream serialisasi. Ada beberapa object yang
tidak diserialisasi kaena data yang diwakilinya berubah secara konstan. Beberapa contoh
dari setiap object adalah object FileInputStream dan Object Thread. Sebuah
NotSerializableException dijalankan jika operasi serialisasi gagal karena beberapa
alasan.
Jangan berputus asa. Sebuah class yang mengandung object yang tidak diserialisasi
dapat tetap diserialisasi jika penunjuk ke object non-serialisasi ditandai dengan
katakunci transient. Pertimbangkan contoh berikut ini :

class MyClass implements Serializable {
transient Thread thread; //try removing transient
int data;
/* beberapa data yang lain*/
}


Kata kunci transient mencagah data dari proses serialisasi. Object instantiasi dari class
ini sekarang dapat ditulis ke sebuah OutputStream.

Serialisasi: Menulis Suatu Object Stream

Untuk menulis object ke sebuah stream, Anda perlu menggunakan
classObjectOutputStream class dan methodnya yaitu method writeObject. Method
writeObject memiliki tanda sebagai berikut :

public final void writeObject(Object obj) throws IOException

dimana obj adalah object yang ditulis ke stream.

Contoh dibawah ini menuliskan sebuah object Boolean ke sebuah ObjectOutputStream.
Class Boolean mengimplementasikan interface yang dapat di Serialisasi. Selanjutnya,
Instantiasi object dari class ini dapat ditulis ke dan dibaca dari sebuah stream.

import java.io.*;
public class SerializeBoolean {
SerializeBoolean() {
Boolean booleanData = new Boolean("true");
try {
FileOutputStream fos = new
FileOutputStream("boolean.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(booleanData);
oos.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
public static void main(String args[]) {
SerializeBoolean sb = new SerializeBoolean();
}
}

Deserialisasi: Membaca Sebuah Object Stream

Untuk membaca sebuah object dari sebuah stream, Anda perlu menggunakan class
ObjectInputStream dan methodnya yaitu method readObject. Method readObject
memiliki tanda sebagai berikut :

public final Object readObject()
throws IOException, ClassNotFoundException

dimana obj adalah object yang dibaca dari stream. tipe Object dikembalikan harus
melalui proses typecast ke nama class yang sesuai sebelum method pada class tersebut
dapat dieksekusi.
Contoh dibawah ini membaca sebuah object Boolean dari sebuah ObjectInputStream. Ini
merupakan kesinambungan dari contoh sebelumnya pada serialisasi.

import java.io.*;
public class UnserializeBoolean {
UnserializeBoolean() {
Boolean booleanData = null;
try {
FileInputStream fis = new
FileInputStream("boolean.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
booleanData = (Boolean) ois.readObject();
ois.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Unserialized Boolean from " +
"boolean.ser");
System.out.println("Boolean data: " + booleanData);
System.out.println("Compare data with true: " +
booleanData.equals(new Boolean("true")));
}
public static void main(String args[]) {
UnserializeBoolean usb = new UnserializeBoolean();
}
}




Minggu, 14 Februari 2010

Janji Yang Nyata

Bangun dan tinggalkanlah tidur panjang …
Sungguh Islam telah kembali …
Di jalan Alloh kita telah berjalan dan mengumandangkan jihad …

Kelompok orang mukmin telah bangkit …
Dengan para pemuda yang jujur …
Dalam malam-malam nestapa mereka berjalan …
Di belakang Al Qur’an yang nyata …

Mereka tidak peduli dengan berbagai kesusahan di antara taring-taring zaman …

Bangun dan tinggalkanlah tidur panjang …
Sungguh Islam telah kembali …
Di jalan Alloh kita telah berjalan dan mengumumkan jihad …

Sampaikanlah kabar gembira kepada manusia …
Dengan subuh yang terbit dengan terang …
Wahai malam-malam para pendholim …
Wahai kehinaan orang-orang yang bermain …
Wahai kesia-siaan selama bertahun-tahun …
Telah datang janji yang nyata …
Kami telah datang kepada kalian dengan membawa senapan dan qur’an yang nyata



Kata Hati



Setiap Perkataan Hati Memang terkadang Membuat benci namun ada rasa Sayang yang takan pernah terlupa dari mata turun melalui Urat Nadi Menembus ke Dalam hAti yang mengalir dalam setiap Tetes air mata bila melihat kekasih hati mesara tersiksa dalam belenggu Cinta mungkin kepedihan tiada memberi sesuatu yang terkesan di hati melainkan suka cita kebersamaan yang lebih istimewa dalam hidup yaitu mendapatkan Cinta yang suci dan abadi yang kan ada didalam hati.