Saturday, May 26, 2012

Stream Data


Stream Data
Stream Data merupakan cara praktis untuk membaca dan menulis tipe data primitif (boolean, char, byte, short, int, long, float dan double). Berbeda dengan stream byte dan stream char dimana tipe data primitif harus diubah dalam bentuk byte atau char untuk dibaca maupun ditulis, dengan menggunakan Data stream, data dapat langsung dibaca/ditulis tanpa diubah dahulu dalam bentuk byte maupun char
Terdapat dua macam data stream yaitu:
1.       DataInputStream
2.       DataOutputStream

DataInputStream
DataInputStream berfungsi untuk saling melengkapi dengan DataOutputStream, yaitu untuk mendapatkan data yang ditulis dengan DataOutputStream. Sebagian method DataInputStream adalah :
        ReadDouble() : membaca data bertipe double
        readInt() : membaca data bertipe integer
        readBoolean() : membaca data boolean
        readUTF() : membaca data dengan encoding UTF-8


DataOutputStream

DataInputStream berfungsi untuk saling melengkapi dengan DataOutputStream, yaitu untuk mendapatkan data yang ditulis dengan DataOutputStream. Sebagian method DataInputStream adalah :
        ReadDouble() : membaca data bertipe double
        readInt() : membaca data bertipe integer
        readBoolean() : membaca data boolean
        readUTF() : membaca data dengan encoding UTF-8

Contoh Program DataInputStream dan DataOutputStream :
import java.io.*;
public class Main {
      public static void main(String[] args) throws IOException {
            int i = 123;
            String s = "Ini String";
            double d = 123.45;
            boolean b = true;
           
            DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
           
            dos.writeInt(i);
            dos.writeUTF(s);
            dos.writeDouble(d);
            dos.writeBoolean(b);
           
            dos.flush();
            dos.close();
           
            DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
           
            int i1 = dis.readInt();
            String s1 = dis.readUTF();
            double d1 = dis.readDouble();
            boolean b1 = dis.readBoolean();
           
            System.out.println(i1);
            System.out.println(s1);
            System.out.println(d1);
            System.out.println(b1);
                       
           
      }
}

Hasil Running Program:
123
Ini String
123.45
true

Buffered Stream
Stream Buffer  digunakan untuk membaca dan menulis data dari suatu area memory yang disebut buffer. Berbeda dengan unbuffered I/O sebelumnya yang pembacaan dan penulisan data ditangani langsung oleh OS sehingga menjadi kurang effisien, dengan menggunakan Stream Buffer maka pembacaan dan penulisan file dilakukan dalam buffer sehingga menjadi lebih effisien.
Ada empat macam Buffered Stream yaitu
        BufferedInputStream : untuk membaca stream byte
        BufferedOutputStream : untuk menulis stream byte
        BufferedReader : untuk membaca stream char
        BufferedWriter : untuk menulis stream char

Contoh Program BufferedInputStream dan BufferedOutputStream
import java.io.*;
public class Main {
      public static void main(String[] args) throws IOException {
            BufferedOutputStream bos = new BufferedOutputStream(System.out);
            BufferedInputStream bis = new BufferedInputStream(System.in);
           
            int data;
            String s = "Program Java";
           
            for(int i=0;i<s.length();i++)
            bos.write((byte) s.charAt(i));
            bos.close();
           
            while ((data = bis.read()) != -1 )
            System.out.print((char) data);
           
            bis.close();
      }
}

Hasil Running:
Program Java

Contoh Program BufferedReader dan BufferedWriter
import java.io.*;
public class Main {
      public static void main(String[] args) throws IOException{
            String s = "Program Java";
            int data;
           
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
           
            for(int i=0;i<s.length();i++)
                  bw.write(s.charAt(i));
            bw.close();
           
            while((data = br.read()) != -1)
            System.out.print((char) data);
            br.close();
      }
}

Hasil Running:
Program Java

Random Access File
Kelas RandomAccessFile merupakan kelas yang berfungsi untuk mengakses file eksternal secara bebas, bebas disini maksudnya kita tidak perlu membaca keseluruhan untuk mendapatkan/mengubah informasi yang terletak pada posisi tertentu dalam sebuah file. Dengan RandomAccessFile, kita langsung dapat mengakses data pada posisi tertentu yang kita inginkan di dalam file. RandomAccessFile biasanya digunakan karena kecepatan aksesnya.
Cara Kerja RandomAccessFile
Kelas RandomAccessFile bekerja seperti merubah sebuah file menjadi sekumpulan array of byte, yang mana didalam kelas ini juga terdapat pointer yang berfungsi untuk menunjukkan posisi byte yang akan diubah atau diambil nilainya.
Kita dapat mengetahui dimana pointer berada dengan method getFilePointer, sedangkan untuk men-set posisi pointer pada suatu posisi digunakan method seek. Untuk dapat membaca byte dari file eksternal pada posisi dimana pointer berada, kita bisa menggunakan method read, sedangkan untuk menulis ke file eksternal, gunakan method write.
Contoh Program RandomAccessFile
import java.io.*;
public class Main {
      public static void main(String[] args) throws IOException {
            // membuat objek raf dengan kelas RandomAccessFile dengan file "contoh.txt"
             RandomAccessFile raf = new RandomAccessFile("contoh.txt", "rw");
             byte b;
             byte[] content = new byte[(int)raf.length()];       
             // mencetak posisi awal pointer
             System.out.println("Posisi pointer awal : "+raf.getFilePointer());
             // mengubah posisi pointer ke nilai 8
             raf.seek(8);
             System.out.println("\nMenjalankan fungsi \"seek(8)\"");
             System.out.println("Posisi pointer setelah proses : "+raf.getFilePointer());
             // membaca karakter yang terdapat pada posisi pointer sekarang
             b = (byte)raf.read();
             System.out.println("\nMenjalankan fungsi \"read()\"");
             System.out.println("Karakter yang terbaca : "+(char)b);
             System.out.println("Posisi pointer setelah proses : "+raf.getFilePointer());
             // merubah karakter pada file eksternal yang terdapat pada posisi pointer sekarang
             raf.write('w');
             System.out.println("\nMenjalankan fungsi \"write('x')\"");
             System.out.println("Posisi pointer setelah proses : "+raf.getFilePointer());
             // membaca seluruh isi file
             raf.seek(0);
             raf.read(content);
             System.out.println("\nMenjalankan fungsi \"read(content)\"");
             System.out.println("String yang terbaca : "+new String(content));
             System.out.println("Posisi pointer setelah proses : "+raf.getFilePointer());
     
       }
}

Dalam file contoh.txt berisi:
Bahasa Java
Hasil Running:
Posisi pointer awal : 0

Menjalankan fungsi "seek(8)"
Posisi pointer setelah proses : 8

Menjalankan fungsi "read()"
Karakter yang terbaca : a
Posisi pointer setelah proses : 9

Menjalankan fungsi "write('x')"
Posisi pointer setelah proses : 10

Menjalankan fungsi "read(content)"
String yang terbaca : Bahasa Jawa
Posisi pointer setelah proses : 11

Parsing Text
Setiap teks biasanya berisi huruf, angka maupun karakter khusus. Untuk menguraikan teks tersebut digunakan parsing text. Parsing Text berarti menguraikan teks berdasarkan huruf, angka, spasi, koma, baris, dll.  Ada berbagai macam cara untuk menguraikan teks
1.       Menggunakan method String.split
2.       Menggunakan kelas StringTokenizer dan StreamTokenizer
3.       Menggunakan kelas Scanner
4.       Menggunakan kelas Pattern dan Matcher
5.       Menggunakan tools JavaCC
Disini hanya akan dibahas cara menguraikan teks dengan menggunakan StreamTokenizer karena susai dengan materi yang dibahas yaitu Stream.

StreamTokenizer
Kelas StreamTokenizer merupakan kelas yang mengambil input stream dan menguraikannya menjadi token yang dapat dibaca satu persatu. StreamTokenizer dapat mengenali huruf, angka, tanda kutip, dll.
Contoh program
import java.io.*;
public class Main {
      public static void main(String[] args) throws IOException {
            int i=0;
            String s = "Data berupa huruf = ";
            double[] d = new double[10];
            StreamTokenizer tokenizer = new StreamTokenizer(new FileInputStream("pars.txt"));

            while(tokenizer.nextToken() != StreamTokenizer.TT_EOF){

                if(tokenizer.ttype == StreamTokenizer.TT_WORD) {
                    s = s +" "+ tokenizer.sval;
                } else if(tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
                    d[i] = tokenizer.nval;
                    i++;
                } else if(tokenizer.ttype == StreamTokenizer.TT_EOL) {
                    System.out.println();
                }

            }
           
            System.out.println(s);
            System.out.print("Data berupa angka = ");
            for(int j=0;j<i;j++)
            System.out.print(d[j]+" ");
      }
}

Dalam File pars.txt tersebut berisi
Nama Budi
NIM 45
IPK 3.75
Prodi Tenik Informatika UNY 2011 Kelas F

Kemudian setalah di parsing menghasilkan output
Data berupa huruf =  Nama Budi NIM IPK Prodi Tenik Informatika UNY Kelas F
Data berupa angka = 45.0 3.75 2011.0

2 comments: