Konsep Dasar IOStream

Apa itu IO Stream ?

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 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.