Saturday, May 26, 2012

I/O, File, dan Stream Byte


I/O, File, dan Stream Byte
A.   Data dan File
1.      Data
Data merupakan representasi nilai yang mengisi satu segmen memory(1 segmen memory = 1 byte = 8 bit).Karena 1 segmen memory tersusun atas 8 bit, maka nilai positif yang mungkin dimiliki adalah 0-(28-1) atau setara dengan 0 – 255d. Nilai ini kemudian digunakan untuk mengkodekan satu karakter (numerik 0-9, abjad kapital A-Z, tanda baca, operator aritmatika dan sebagainya).
2.      File
File adalah wadah yang menyusun data menjadi satu entititas kesatuan. Data dalam file disusun sebagi satu entititas kesatuan yang terurut. Terurut disini berarti tiap-tiap byte tersebut diletakan dalam posisi sedemikian rupa, sehingga sesuai dengan urutan proses penyusunannya yaitu satu  byte setelah byte yang lain.
Jenis-jenis File :
·         File Biner(Hex File)
Adalah file yang hanya dapat diartikan sebagai nilai numerik untuk setiap byte datanya (0-255d), tanpa harus diterjemahkan terlebih dahul menjadi kode ASCII/EBCDEDIC/Unicode. File ini disebut juga sebagai File Hexadesimal (Hex File) karena nilai numerik data tersebut sering juga direpresentasikandalam sistem bilangan hexadesimal (0-FFh).
·         File Text
Adalah file yang hanya dapat diartikan dalam bentuk “Terjemahan” dari setiap nilai numerik  byte ke dalam kode ACII/EBCDIC/Unicode. Kita dapat melihat isi/informasi dari file tersebut dengan menggunakan text editor biasa (Dos Editor, Notepad, Wordpad, MS Word dan sebagainya).

B.   Membaca dan Menulis File
Membaca dan menulis file ada 5 langkah :
1.      Membuat objek file dari kelas file
Bentuk umumya adalah
File finput = new File (“masukan.dat”);
File finput = new File (“c:\latihan\masukan.dat”);
File foutput = new File (“keluaran.dat”);
File foutput = new File (“c:\latihan\keluaran.dat”);
2.      Mengasosiasikan objek file tersebut dengan objek steam
Kita dapat juga menggunakan file yang tersimpan sebagai input dan output. Kita dapat menggunakan :
·         FileInputStream è untuk input
·         FileOutputStream èuntuk output
Dapat juga menggunakan stream byte sebagai tipe data primitif :
·         DataInputStream
·         DataOutputStream
3.      Memasukan objek stream ke buffer
Buffer sebagai penampung sejumlah chunk data yang telah dibaca oleh program dari suatu file input tau sebaliknya.
Dengan buffer mekanisme baca tulis data dapat lebih efisien, karena tidak perlu bolak balik ke objek stream untuk mengambil data
                 BufferedInputStream bufIn = new BufferedInputStream (fis);
                 BufferedInputStream bufOut = new BufferedOutputStream (fos);
4.      Membaca atau mengirimkan data ke objek steam atau buffer
Objek stream merupakan representasi dari file input/output. Pertama membuat objek stream baru kita bisa membaca dan menulis data dengan method yang tersedia pada kelas stream bersangkutan.
Contoh :
int dataMasukan = fis.read();
fos.write(dataMasukan);
bila menggunakan buffer :
int dataMasukan = bufin.read();
bufOut.write(dataKeluaran);
5.      Menutup objek stream atau buffer dan objek file
Setelah proses membaca dan menulis selesai, stream yang kita buat harus di tutup.  
Contoh :
fis.close();
fos.close();
Method untuk menutup buffer :
bufIn.close();
bufOut.close();
Method untuk menutup objek file :
fileIn.close();
fileOut.close();
C.   Stream
Stream merupakan dasar operasi input-output ( I/O ) dalam Java yang menggunakan package java.io sebagai package utama. Stream adalah representasi abstrak dari input dan output device, dimana aliran bytes akan ditransfer seperti file dalam harddisk, file pada sistem remote atau printer. Kita dapat membaca data dari input stream, yang dapat berupa file, keyboard atau komputer remote. Sedangkan untuk operasi penulisan berarti menulis data pada output stream.
       Stream juga bisa dibedakan berdasarkan jenis data yang dialirkan pada stream, stream karakter dan stream byte. Stream byte digunakan untuk mengalirkan data byte (8 bit). Adapun stream karakter digunakan untuk mengalirkan data 16 bit.
        Class-class untuk fungsi I/O berada dalam package java.io. Class dasar InputStream dan OutputStream merupakan abstract-class, dari mana diturunan semua class-class spesifik lainnya. Dengan demikian, dalam Java kita dapat menangani semua aliran data (stream) dengan cara seragam. Karena bersumber dari satu superclass, maka metode yang dipakaipun seragam.
       Class dasar lainnya, Reader dan Writer merupakn dasar bagi fungsi-fungsi karakter (char) I/O. Class ini mendukung pemakaian karakter Unicode. Kedua class ini juga merupakan superclass bagi banyak class-class spesifik lainnya.
Berikut adalah hirarki dari class-class dalam package java.io.
ü  InputStream dan Output Stream
InputStream
OutputStream
·         FilterInputStream
o   BufferedInputStream
o   DataInputStream
o   LineNumberInputStream
o   PushbackInputStream
·         ByteArrayInputStream
·         FileInputStream
·         ObjectInputStream
·         PipedInputStream
·         SequenceInputStream
·         StringBufferInputStream
·         FilterOutputStream
o   BufferedOutputStream
o   DataOutputStream
o   PrintStream
·         ByteArrayOutputStream
·         FileOutputStream
·         ObjectOutputStream
·         PipedOutputStream
ü  Reader dan Writer
Reader
Writer
·         BufferedReader
o   LineNumberReader
·         CharArrayReader
·         FilterReader
o   PushbackReader
·         InputStreamReader
o   FileReader
·         PipedReader
·         StringReader
·         BufferedWriter
·         CharArrayWriter
·         FilterWriter
·         OutputStreamWriter
o   FileWriter
·         PipedWriter
·         StringWriter
·         PrintWriter


ü  Class-class File, Object I/O dan lainnya
·         File
·         RandomAccesFile
·         FileDescriptor
·         FilePermission
·         ObjectStreamClass
·         ObjectStreamField
·         SerializablePermission
·         StreamTokenizer


D.   Stream Byte
Nama Kelas
Keterangan
BufferedInputStream
Stream input yang telah ter-buffer
BufferedOutputtStream
Stream output yang telah ter-buffer
ByteArrayInputStream
Stream input yang membaca dari array byte
ByteArrayOutputStream
Stream output yang membaca ke array byte
DataInputStream
Stream input yang berisi method-method untuk membaca tipe data standar yang terdapat dalam Java
DataOutputStream
Stream output yang berisi method-method untuk menuliskan tipe data standar yang terdapat dalam Java
FileInputStream
Stream input yang membaca dari sebuah file
FileOutputStream
Stream output yang menulis ke sebuah file
FilterInputStream
Mengimplementasikan InputStream
FilterOutputStream
Mengimplementasikan OutputStream
InputStream
Kelas abstrak yang menjelaskan stream input
OutputStream
Kelas abstrak yang menjelaskan stream output
PipedInputStream
Penyalur input
PipedOutputStream
Penyalur output
PrintStream
Stream output yang berisi method println() dan print()
Didefinisikan menggunakan dua buah hirarki kelas InputStream dan OutputStream yang merupakan kelas abstrak.
Kelas yang termasuk dalam kategori stream byte :

1.      InputStream
Subclass-subclass dari inputStream adalah : AudioInputStream, ByteArrayInputStream, FileInputStream, FilterInputStream, PipedInputStream, SequenceInputStream, dan StringBufferInputStream. Dua method utama dari InputStream adalah :
·         Read
Method ini digunakan untuk membaca stream.
·         Close
Method ini digunakan untuk menutup koneksi input stream.

Contoh Program :
import java.io.*;
    class InputStream {
    public static void main(String[] args) throws IOException {
    byte[] data = new byte[10];
    System.out.print("Ketik 10 buah karakter :");
    System.in.read(data); //input stream
    System.out.print("Karakter yang Anda ketik yaitu : ");
  for(int i=0;i<data.length;i++) {
  System.out.println((char)data[i]); }
     }          
 }

2.      Output Stream
Subclass-subclass dari outputStream adalah :
·         ByteArrayOutputStream : digunakan untuk menuliskan stream menjadi byte array.
·         FileOutputStream : digunakan untuk menulis pada file
·         FilterOutputStream : merupakan superclass dari subclass-subclass seperti DataOutputStream, BufferOutputStream, PrintStream, CheckedOutputStream.
·         ObjectOutputStream : digunakan untuk menuliskan objek pada OutputStream.
·         PipedOutputStream : digunakan untuk menjadi output dari PipedInputStream.

Sebagian method-method OutputStream adalah :
·         Voidclose()
Menutup output stream yang aktif dan melepaskan sumber daya terkait dengan stream tersebut.
·         Void flush()
Melakukan flush output stream dan memaksa semua byte buffer untuk dituliskan keluar.
·         Void write(byte[] b)
Menulis sebanyak b.length dari byte array ke output stream
·         Void write(byte[] b, int off, int len
Menuliskan sebanyak len byte dari byte array b dimulai dari index off




Contoh Program:
import java.io.*;
class OutputStream {
public static void main(String[] args) throws IOException {
                        byte[] data = {'a','b','c','d','e','f','g'};
                        System.out.write(data,3,4); //output stream
                        System.out.write('\n'); //pindah baris
                         System.out.write(data); //tulis semua isi array data
            }
 }

Output :
E.   File Stream
1.      Class File
Class File merupakan representasi dari file dan direktori (path). Constructornya :
File(String pathname)
à
membuat file dalam direktori tertentu, nama file tertentu.

File(String parent, String child)
File(File parent, String child)

à
Membuat file dengan posisirelatif terhadap direktori parent. Direktori relative parent dapat berupa string ataupun direktori dari sebuah file. Child menyatakan sub-direktori atau nama file yang terletak relative terhadap parent
File(URI uri)
à
Merupakan objek URI (Uniform Resource Identifier). Misalnya, file:/// D:\JAVA\Gui1.HTML. bentuk URI merupakan spesifik platform.


Konstruktor File :
File(String) : membuat objek file 
File(String, String) :membuat objek file dengan directori tertentu
             File(File, String) : membuat objek File dingen direktori tertentu 

Beberapa method penting yang tersedia :
canRead()  : boolean , menentukan apakah file dapat dibaca/tidak
canWrite() :boolean , menentukan apakah file dapat dutulis /tidak
delete()       : boolean menentukan apakah file dapat dihapus/tidak
exists()  : boolean, menentukan apakah suatu file ada /tidak
getName() : memberikan nama file
                     getParent() : memberikan nama direktori induk
             getPath()   : memberikan path
             isAbsolute() : boolean mengindikasi bahwa nama file bersifat absolut.
isDirectory()  : Mengembalikan indikasi Boolean yaitu bukan sebuah file yang sudah ada. .
isFile() : Mengembalikan indikasi Boolean yaitu bukan sebuah file normal yang sudah ada.
lastModified() : Mengembalikan waktu modifikasi yang terakhir.
length() : Mengembalikan panjang file.
list() : Me-Lists file-files dalam sebuah direktori.
list(FilenameFilter) : menggunakan filter spesifik untuk me-list file-file ke dalam sebuah direktori.
mkdir() : Membuat sebuah direktori dan megembalikan suatu Boolean indikasi pembuatannya sukses.
mkdirs() : Membuat semua direktori dalam path itu.
renameTo(File) : Memeberikan nama ulang file dan mengembalikan suatu Boolean mengindikasi atau tidak method sukses. whether or not this method was successful.
Contoh demo penggunaannya :
import java.io.*;
class classfile{
            public static void cetak(String s){
                        System.out.println(s);}

  public static void main(String[] ar){
 String direk1="d:/Semester 2/Pemrograman 2/Stream kelompok/print";
            String direk2=("d:/Semester 2/Pemrograman 2/Stream kelompok/kiky");
    File f1=new File(direk1);
    File f2=new File(direk2);
    File f3=new File("c:/Semester 2");
    cetak("Objek f1 adalah :"+f1);
    cetak("Objek f1 adalah :"+f2);
    cetak("f1.isDirectory():"+f1.isDirectory());
    cetak("f2.isDirectory():"+f2.isDirectory());
    cetak("f1.list()  :"+f1.list());
    cetak("f2.list()  :"+f2.list());
    cetak("canRead()  :"+f1.canRead());
    cetak("canRead()  :"+f2.canRead());
    cetak("f2.exists():"+f2.exists());
    f2.renameTo(f3);
    cetak("f2.exists():"+f2.exists());
 }
}
Output :
2.      FileInputStream
class FileInputStream  menangani pembacaan data dari suatu file.   

file :d:/semester 2/coba.java (berukuran 108 byte)
 

class coba{
          public static void main(String[] arg){
                      System.out.println("HELO SELAMAT PAGI");
  }
}




Contoh : Membaca isi file dan cetak ke layar
import java.io.*;
import java.util.*;
Membaca file dari file coba.java
class fis{
          public static void main(String[] arg) throws Exception {

            int size;
            InputStream f1=new   FileInputStream("d:/semester 2/coba.java");
            size=f1.available();
            System.out.println("Available bytes :"+size);
            System.out.println("First 1/4 file read(): ");
            for(int i=0; i<size/4;i++)
         System.out.print((char) f1.read());
                       System.out.println("");
                       System.out.println("Total byte available: "+f1.available());
                       byte[] b=new byte[f1.available()/3];
                       System.out.println("Membaca 1/3 dari sisa: "+f1.available()/3);
                       if(f1.read(b)!=b.length)//membaca file
                          System.err.println("ada yang salah..");
                                  System.out.println("Hasil : " );
                                  for(int i=0; i<b.length;i++)
                                      System.out.print((char) b[i]);
output Stream, menutup
                                              System.out.println(" SELESAI");
                                              f1.close();       
  }
}


Output :
3.      FileOutputStream
Merupakan kebalikan dari FileInputStream. Objek dari kelas FileOutputStream akan mengirimkan data-data program ke file output.
Instansiasi objek stream dengan menggunakan konstruktor:
FileOutputStream file2 = new FileOutputStream(String)
 


Argumen dari string ini sama seperti pada FilrInputStream. Bisa berupa nama file atau path dan nama file output.Digunakan method write(int data) untuk menulis data ke file.Setelah selesai, gunakan close() untuk menutup stream.
            Contoh program:
            /*
 * Program Demo FileOutputStream
 */

package tugasjavaindividu2;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 *
 * @author Tikanosa
 */
public class Main {
    public static void main(String[] args) {
        FileOutputStream foutput=null;
        String data="Nama saya KAMI. Namamu siapa?";

        //membuka file
        try{
            foutput = new FileOutputStream("d:/Output.txt");
        }catch(IOException e){}

        //menulis data kedalam file à File output stream
        try{
            for(int i=0;i<data.length();i++){
                foutput.write((char) data.charAt(i));               
            }
        }catch(IOException e){}

        try{
            foutput.close();
        }catch(IOException e){}
    }

}
Output:


Isi File pada Output.txt adalah


F.    Print Stream
Proses pembacaan dan penulisan stream byte pada dasarnya merupakan proses membaca dan menulis data biner. Bila stream data tersebut disimpan ke dalam file, maka file itu akan berformat biner pula (hex file). Kita tidak dapat melihat isi data yang sebenarnya dengan menggunakan text editor biasa(dos editor, notepad, wordpad, atau MS Word) karena tool-tool itu akan menerjemahkan format data biner ke dalam bentuk karakter ASCII.

Agar  stream byte dapat disimpan dalam bentuk nilai, maka kita harus menggunakan salah satu dari jenis kelas print, yakni PrintStream dan PrintWriter

a.     Kelas PrintStream
Konstruktor:
1.      PrintStream(OutputStream out)
2.      PrintStream(OutputStream out, boolean autoFlush)
3.      PrintStream(OutputStream out, boolean autoFlush, String encoding).
Contoh program:
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;
import java.io.File;

public class printstream {
            public static void main(String[] args) throws FileNotFoundException{
                        //membaca dan menulis file
                        String npm = new String("");
                        String nama = new String("");
                        double ipk;
                        PrintStream diskWriter = new PrintStream("d:/mhs.txt"); //menyatakan print stream
                        int i;
                        Scanner sc = new Scanner(System.in);
                        System.out.print("Jumlah data = ");
                        i = sc.nextInt();
                        do{
                                    System.out.print("\nNIM = ");
                                    npm = sc.next();
                                    System.out.print("Nama = ");
                                    nama = sc.next();
                                    System.out.print("IPK = ");
                                    ipk = sc.nextDouble();
                                    diskWriter.println(npm + " " + nama + " " + ipk);
                                    i--;
                        }while(i>0);
           
                        System.out.println("Isi File:");
                        Scanner diskScanner = new Scanner(new File("d:/mhs.txt")); //mencetak print stream pada file mhs.txt
                        //bentuk penulisanna/cetakannya seperti ini               
while (diskScanner.hasNext()){
                                    npm = diskScanner.next();
                                    nama = diskScanner.next();
                                    ipk = diskScanner.nextDouble();
                                    System.out.println("[" + npm + "] " + nama + " (" + ipk + ")");
                        }
            }
}

Output Program:
Isi File yang ada pada mhs.txt sekarang adalah sama dengan isi file/output dari masukan kita.
b.    Kelas PrintWriter
Ø  Konstruktor:
1.      PrintWriter(OutputStream out)
2.      PrintWriter(OutputStream out, boolean autoFlush)
3.      PrintWriter(Writer out)
4.      PrintWriter(Writer out, boolean autoFush)
Ø  Contoh Program :
import java.io.*;
public class PrintWriterKiky {
          public static void main(String[]args){
                      //mendeklarasikan print stream
                      PrintWriter pw = null;
                      File fileTemp = new File("d:/printwriter.txt");
                     
                      if(fileTemp.exists()){
                                  System.out.println("File ini sudah ada! \n" + "Hapuslah terlebih dahulu " + "dan jalankan kembali.");
                                  System.exit(0);
                      }
                     
                      //menulis data
                        try{
                                    //membuat stream output untuk fileTemp
                                    pw= new PrintWriter(new FileOutputStream(fileTemp), true);
                                    for(int i=0; i<10; i++)
                                                pw.print((int)(Math.random()*1000)+" ");
                        }
                        catch(IOException ex){
                                    System.out.println(ex.getMessage());
                        }
                        finally{
                                    //Menutup File
                                    if(pw != null) pw.close();
                        }
            }    
   
  }

Ø  Output pada Run

Ø  Output pada file prinwriter.txt

G.  Buffered Stream
Class BufferedInputStream dan class BufferedOutputStream bertujuan untuk melakukan buffering (penyanggaan data) sebelum proses baca dari file atau tulis ke file.
Pada proses tulis ke file tanpa buffer penulisan dilakukan ke file secara fisik oleh program , sedangkan dengan menggunakan buffer penulisan dilakukan pada buffer dan secara otomatis jika buffer penuh penulisan ke file akan dilakukan oleh java.
Contoh program
import java.io.*;
class Bufio
{ public static void main(String[] arg) throws Exception
  {FileOutputStream fos=new FileOutputStream("TesBuf.txt");
   BufferedOutputStream bos=new BufferedOutputStream(fos,1024);
   byte[] b=new byte[10];
   long t0=System.currentTimeMillis();
   for(int i=0;i<500;i++)
       { ("nulis#"+i).getBytes(0,10,b,0);
         bos.write(b);
       }
   bos.flush();
   bos.close();
   long t1=System.currentTimeMillis();
   System.out.println("Dengan Buffer, waktu: "+ (t1-t0));
   
   FileOutputStream fos_nb=new FileOutputStream("TesBuf2.txt");
   long t2=System.currentTimeMillis();
   for(int i=0;i<500;i++)
       { ("nulis#"+i).getBytes(0,10,b,0);
         fos_nb.write(b);
       }
   fos_nb.flush(); //output stream
   fos_nb.close();
   long t3=System.currentTimeMillis();
   System.out.println("Tanpa Buffer, waktu: "+ (t3-t2)); }}
Output
H.   
Program Utama

Ø  Syntaks Program
/*
 * Program Demo All
*/
package tugasjavaindividu5;
import java.io.*;
/**
 *
 * @author Tikanosa
 */
public class Main {
    public static void main(String[] args) {
        try{
            //input
            FileInputStream fis = new FileInputStream("d:\\buffer1.txt"); //file input stream
            BufferedInputStream bis = new BufferedInputStream(fis); //buffer input stream

            //ouput
            FileOutputStream fos = new FileOutputStream("d:/buffer2.txt");  //file output stream
            BufferedOutputStream bos = new BufferedOutputStream(fos); //buffer output stream

//penggunaan printstream
            PrintStream ps = new PrintStream(bos);
            ps.println("Backup file buffer1.txt");

            //Baca/tulis file per byte melalui buffered stream
            int code = 0;
            while(code != -1){
                if((code = bis.read()) != -1)
                    ps.print((char) code);
            }

            //tutup stream
            bis.close();
            ps.close();
        }
        catch (FileNotFoundException fe) { fe.printStackTrace();}
        catch (IOException ie) { ie.printStackTrace();}
    }

}
Output pada file buffer2.txt:
























DAFTAR PUSTAKA

Wijono, Matius Soesilo dkk. Java 2 SE dengan JBuilder. Penerbit ANDI. Yogyakarta, 2004.
Fikri, Rijalul dkk. Pemrograman Java. Penerbit ANDI. Yogyakarta, 2005
Campione, Mary.Walrath, Kathy. The Java Tutorial. Sun, Nov 2003.
Wutha, Mark. Java Expert Solution
Eckel, Bruce. Thinking in Java. Prentice-Hall PTR, 1998.
Eckel, Bruce. Java Code Convention. Prentice-Hall PTR, 1998.
Mike Cohn. Teacher Your Self Café 2 in 21 Days. Sams.net Publishing 1997

No comments:

Post a Comment