IOStream merupakan sumber input atau output tujuan. Sebuah stream dapat mewakili berbagai macam sumber dan tujuan, termasuk file disk, perangkat, program lain, dan array memori. IOStream mendukung banyak jenis data, termasuk byte sederhana, tipe data primitif, karakter lokal, dan objek. Beberapa aliran sekedar menyampaikan data, orang lain memanipulasi dan mengubah data dengan cara yang bermanfaat. Kira-kira dapat dianalogikan seperti ini.
Alur program menggunakan inputstream untuk membaca data dari sebuah sumber
Alur program menggunakan output stream untuk menulis data ke tujuan
Tipe-tipe stream yang digunakan :
1. Stream Karakter dan Byte
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.
2. Stream Input dan Output
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).
3. Node dan Filter Stream
Stream node adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari sebuah lokasi khusus seperti pada disk atau dari jaringan. Filter Stream adalah suatu stream yang 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.
Stream node adalah sebuah stream dengan fungsi dasar berupa fungsi membaca atau menulis dari sebuah lokasi khusus seperti pada disk atau dari jaringan. Filter Stream adalah suatu stream yang 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.
Stream Chaining ?
Pada intinya, stream chaining adalah penambahan lapisan pada sebuah
stream node. (lengkapnya search)
Class-class File
Class File adalah sebuah perwakilan dari abstraksi dari file-file nyata dan nama path direktori.
Berikut contoh Penerapan Code pada Class File :
Perhatian ! untuk warna font merah berarti menandakan bahwa hal tersebut adalah method file.
import java.io.*;
public class rizky_34 {
public static void main(String args[]) {
String fileName = args[0];
/* Instansiasi sebuah object File dengan nama path khusus sebagai nama filenya */
File fn = new File(fileName);
/* Mengembalikan nilai nama file atau nama direktori dari object File ini */
System.out.println("Name: " + fn.getName());
/* Menguji apakah sebuah file atau sebuah direktori masih ada atau tidak */
if (!fn.exists()) {
System.out.println(fileName + " does not exists.");
/* Membuat sebuah temporary directory */
System.out.println("Creating temp directory...");
fileName = "temp";
/* Pembuatan objek baru */
fn = new File(fileName);
/* Membuat sebuah direktori yang merupakan abstraksi nama path ini */
fn.mkdir();
System.out.println(fileName + (fn.exists()? "exists": "does not exist"));
System.out.println("Deleting temp directory...");
/* Membuang file atau direktori yang sebenarnya diwakili oleh object File tersebut */
fn.delete();
System.out.println(fileName + (fn.exists()? "exists": "does not exist"));
return;
}
/* Menguji apakah objek ini berupa sebuah file atau bukan */
System.out.println(fileName + " is a " + (fn.isFile()? "file."
:"directory."));
if (fn.isDirectory()) {
/*
Mengembalikan nilai daftar file dan subdirektori yang
ada dalam object ini. Object ini haruslah berupa
sebuah direktori */
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]);
}
}
/* Mengembalikan nilai true jika dijinkan untuk membaca dari file. Sebaliknya, nilai pengembaliannya bernilai false */
if (!fn.canRead()) {
System.out.println(fileName + " is not readable.");
return;
}
/* Mengembalikan nilai ukuran dari file */
System.out.println(fileName + " is " + fn.length() + " bytes long.");
/* Mengembalikan nilai tanggal dalam milidetik ketika file terakhir kali dimodifikasi */
System.out.println(fileName + " is " + fn.lastModified() + " bytes long.");
/*Mengembalikan nilai true jika diijinkan untuk menulis ke sebuah file. Sebaliknya, nilai pengembaliannya bernilai false */
if (!fn.canWrite()) {
System.out.println(fileName + " is not writable.");
}
}
}
Class Reader & Class Writer
Class
Reader adalah suatu stream yang menggambarkan stream karakter yang
digunakan untuk membaca sedangkan Class Writer adalah suatu stream yang
menggambarkan stream karakter yang digunakan untuk menulis.
Berikut contoh Penerapan Code pada Class Reader & Class Writer :
Perhatian ! untuk warna font merah berarti menandakan bahwa hal tersebut adalah Class Node & Filter Reader atau Writer.
import java.io.*;
class rizky_34 {
void copy(String input, String output) {
/*
Mengizinkan penyimpanan sementara karakteryang bertujuan untuk
menyediakan fasilitas pembacaan karakter, arrays, dan bait */
/* Menyediakan penyangga karakter bertujuan untuk menyediakan efisiensi penulisan karakter, array, dan garis */
BufferedReader reader; BufferedWriter writer; String data;
try {
/* Untuk membaca karakter ke sebuah file */
reader = new BufferedReader(new FileReader(input));
/* Untuk menulis karakter ke sebuah file */,/span>
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);
}
}
Class InputStream & Class OutputStream
Class
InputStream adalah suatu stream yang menggambarkan perbedaan stream
byte yang digunakan membaca sedangkan Class OutputStream adalah suatu
stream yang menggambarkan tentang byte stream yang berbeda yang
digunakan dalam proses penulisan.
Berikut contoh Penerapan Code pada Class InputStream & Class OutputStream :
Perhatian ! untuk warna font merah berarti menandakan bahwa hal tersebut adalah Class Node & Filter InputStream atau OutputStream.
import java.io.*;
class IO04 {
void copy(String input, String output) {
/* Untuk membaca Line byte dari sebuah file */
FileInputStream inputStr;
/* Untuk menulis byte ke sebuah file */
FileOutputStream outputStr;
int data;
try {
inputStr = new FileInputStream(input);
outputStr = new FileOutputStream(output);
while ((data = inputStr.read()) != -1) {
outputStr.write(data);
}
inputStr.close();
outputStr.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);
}
}
Serialisasi ?
Serialisasi digunakan untuk menulis suatu object stream, sedangkan Deserialisasi digunakan untuk membaca sebuah object stream.
Berikut contoh source code pada serialized :
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.wrhteObject(booleanData);
oos.close();
} catch (IOException ie) {
ie.printStackTrace();
}
}
public static void main(String args[]) {
SerializeBoolean sb = new SerializeBoolean();
}
}
Berikut contoh source code pada deserialized :
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();
}
}
Keyword transcient ?
Kata kunci transcient berguna sebagai mencagah data dari proses serialisasi.
Sebuah
class yang mengandung object yang tidak diserialisasi dapat
tetap diserialisasi jika penunjuk ke object non-serialisasi
ditandai dengan kata kunci transient, seperti pada contoh code berikut :
/* class dessy_11 mengimplementasikan method dari class Serializable , untuk lebih lengkapnya simak postingan Belajar PBO II */
class dessy_11 implements Serializable {
transient Thread thread; /* mencoba me-remove transcient */
int data; /* beberapa data yang lain */
}
Contoh Program menggunakan IO Stream
Keterangan :
Line 1 : Menyertakan semua class dalam paket java.io untuk menyediakan penanganan input/output stream
Line 2 : Mendefinisikan class dengan nama BacaFile().
Line 3 : Inisialisasi objek komponen – komponen yang akan digunakan.
Line 4 : Mendefinisikan eof sebagai variabel Boolean.
Line
5 : Merupakan sebuah constructor dari class BacaFile yang nantinya akan
akan dijalankan saat objek dari class BacaFile terbentuk.
Line 6 : Inisialisasi file dengan objek f yang bernama text.txt
Line 7-9 : Sintaks untuk pengecekan apakan text.txt itu ada dan merupakan sebuah file. Jika benar maka akan muncul kata “OK”.
Line 10-13 : Jika tidak bernilai benar pada pengecekan yang sebelumnya maka akan dicek lagi pada sintaks bagian else ini. Ketika sudah dicek pada bagian else ini, akan muncul tulisan “File not found” dan langsung keluar.
Line
14-31 : Bagian ini merupakan blok try-catch yang dapat mengangani
adanya penangkapan sinyal exception bila terjadi error. Ada inisialisasi
objek fin yang merupakan objek dari class FileInputStream dan berisi
objek dari file yang telah didefisikan sebelumnya. EOF diberi nilai
false lalu variabel count diberi nilai 0. Kemudian ada sintaks
perulangan while yang akan mengulang untuk membaca text.txt yang
disimpan dalam variabel input. Jika input bernilai -1 maka itu merupakan
end of file. Jika bukan maka count akan bertambah 1. Perulangan
tersebut akan terus berlangsung ketika tidak ditemukan eof. Setelah itu
file ditutup dan akan menampilkan count yang sudah diproses.
Line 32 : Mendefinisikan method main. Main method ini digunakan untuk menjalankan program.
Line 33 : Perintah untuk menjalankan constructor yang ada di class BacaFile.