Anda di halaman 1dari 10

Algoritma dan Pemrograman 3

PENGENALAN INPUT OUTPUT


A. Tipe Stream yang Umum Digunakan
1. Stream Character dan Stream Byte
Secara umum ada 2 (dua) tipe dari stream, yaitu: stream character dan stream byte.
Perbedaan mendasar antara keduanya yaitu Stream byte adalah abstraksi file atau
alat untuk data biner sedangkan Stream character adalah untuk character
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 character, 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 character.
2. Input dan Output Stream
Stream juga dikategorikan berdasarkan apakah mereka digunakan untuk membaca
atau menulis stream. Walaupun ini sudah cukup nyata, User diijinkan untuk
membaca dari input stream tapi tidak menulisnya. Di lain pihak, User diijinkan 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 user memperoleh informasi dari
stream ini. sementara itu output stream disebut juga stream hasil (sink stream).
3. 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.
B. Input Stream
Pada subbab ini memberikan gambaran perbedaan stream byte yang digunakan
membaca.
1. Method InputStream
Class InputStream terdiri atas beberapa method untuk membaca byte. Beberapa
method class:
a. public int read(-) throws IOException
Method overloaded, juga memiliki tiga versi seperti class Reader tersebut.
i.
public abstract int read() - Membaca byte selanjutnya dari data dari stream ini.
ii.
public int read(byte[] bBuf) - Membaca sejumlah byte dan menyimpannya
dalam byte array bBuf.
iii.
public abstract int read(char[] cbuf, int offset, int length) Membaca panjang
sejumlah length byte dan menyimpannya dalam array byte bBuf dimulai dari
offset tertentu.
b. public abstract void close() throws IOException
Menutup stream in. Memanggil method InputStream yang lain setelah menutup
streamnya akan menyebabkan sebuah IOException dijalankan.
c. public void mark(int readAheadLimit) throws IOException

Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3


Menandai posisi tertentu dalam stream. Setelah menandainya, panggil untuk
menjalankan fungsi reset() akan mencoba untuk mengatur posisi streamnya pada
titik tertentu kembali. Tidak semua stream input-byte mendukung operasi ini.
d. public boolean markSupported()
Mengindikasikan apakah suatu stream mendukung operasi pemberian tanda
(mark) dan reset yang tidak didukung secara default. Seharusnya diubah menjadi
overide oleh subclass.
e. public void reset() throws IOException
Merubah posisi stream pada posisi akhir yang diberi tanda (mark)
2. Class-Class Node InputStream
Berikut ini merupakan beberapa class-class dasar InputStream :
a. FileInputStream
Untuk membaca baris byte dari sebuah file
b. BufferedArrayInputStream
Mengimplementasikan sebuah penimpan sementara yang terdiri atas data byte,
yang mungkin dapat dibaca dari streamnya.
c. PipedInputStream
Seharusnya terhubung ke sebuah PipedOutputStream. Stream ini secara khusus
digunakan oleh dua urutan yang di dalamnya satu dari urutan tersebut membaca
data dari sumber ini sementara urutan yang lain menulis ke PipedOutputStream
tujuan.
3. Class-class Filter InputStream
Untuk menambah fungsi ke class dasar InputStream, Anda dapat menggunakan class
stream filter. Berikut ini adalah beberapa dari class-class tersebut:
a. BufferedInputStream
Sebuah subclass dari FilterInputStream yang memungkinkan penyimpanan input
sementara untuk menyediakan pembacaan byte yang lebih efisien.
b. FilterInputStream
Untuk membaca byte stream yang telah terfilter, yang mungkin memindahkan
source dasar dari data sepanjang proses dan menyediakan fungsi tambahan.
c. ObjectInputStream
Digunakan untuk serialisasi object. Deserialisasi object dan data primitif yang
telah tertulis sebelumnya menggunakan sebuahObjectOutputStream.
d. DataInputStream
Sebuah subclass dari FilterInputStream yang memerintahkan sebuah aplikasi
membaca data primitif Java dari sebuah input stream dasar dalam sebuah Mesin
yang berjalan secara bebas (machine-independent way).
e. LineNumberInputStream
Sebuah subclass FilterInputStream yang memungkinkan pemeriksaan posisi dari
nomor baris tertentu.
f. PushbackInputStream
Sebuah subclass dari class FilterInputStream yang memungkinkan byte diproses
balik atau tidak dibaca ke bentuk sreamnya.
C. Output Stream
Sesi ini memberikan sebuah pandangan tentang byte stream yang berbeda yang
digunakan dalam proses penulisan.
1. Method OutputStream
Class OutputStream terdiri atas beberapa method untuk menulis data byte. Berikut
ini adalah beberapa dari class methodnya:
Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3


a. public void write(-) throws IOException
Sebuah method overloaded untuk menulis bentuk byte ke bentuk stream. Ada
tiga versi:
i. public abstract void write(int b) Menulis nilai byte khusus b ke bentuk output
streamnya.
ii.
public void write(byte[] bBuf) Menulis isi dari array byte bBuf ke bentuk
stream nya.
iii.
public void write(byte[] bBuf, int offset, int length) Menulis sejumlah length
byte dari array bBuf ke bentuk streamnya, dimulai pada offset khusus ke
streamnya.
b. public abstract void close() throws IOException
Menutup stream ini dan mengeluarkan beberapa sumber dari sistem
digabungkan dengan streamnya. Penggunaan method lain setelah memanggil
method ini akan menyebabkan sebuahIOException dijalankan.
c. public abstract void flush()
Mengganti stream (sebagai contoh, data byte tersimpan dalam buffer akan
segera ditulis dalam tujuan yang dimaksud).
2. Class-Class Node OutputStream
Berikut ini adalah beberapa dari class dasar OutputStream:
a. FileOutputStream
Untuk menulis byte ke sebuah file.
b. BufferedArrayOutputStream
Mengimplementasikan sebuah penyimpan sementara berupa byte, yang mana
mungkin akan dituliskan ke bentuk streamnya.
c. PipedOutputStream
Seharusnya tersambung ke sebuah PipedInputStream. Stream ini secara khusus
digunakan oleh dua urutan dimana di dalamnya satu dari urutan tersebut menulis
data ke bentuk streamnya sementara urutan yang lain membaca dari
PipedInputStream tujuan.
3. Class-Class Filter OutputStream
Untuk menambah fungsi ke class dasar OutputStream, Anda dapat menggunakan
class stream filter. Berikut ini beberapa dari class tersebut:
a. BufferedOutputStream
Sebuah subclass dari FilterOutputStream yang memungkinkan penyimpanan
output sementara untuk proses penulisan byte yang lebih efisien. Memungkinkan
penulisan byte ke bentuk dasar output stream tanpa menyebabkan diperlukannya
pemanggilan dasar sistem untuk setiap penulisan byte.
b. FilterOutputStream
Untuk menulis stream byte yang telah difilter, yang mana mungkin dipindahkan
ke source dasar dari data sepanjang proses dan menyediakan fungsi tambahan.
c. ObjectOutputStream
Digunakan untuk serialisasi object. Serialisasi object dan data primitif untuk
sebuah OutputStream.
d. DataOutputStream
Sebuah subclass dari FilterOutputStream yang menjalankan aplikasi penulisan
data primitif ke output stream dasar ke dalam sebuah mesin yang bebas berjalan
(machineindependent way).
e. PrintStream
Sebuah subclass dari FilterOutputStream yang menyediakan kemampuan untuk
mencetak representasi dari nilai data yang bermacam-macam dengan tepat.
Contoh Dasar InputStream/OutputStream
Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3


Contoh berikut ini menggunakan class FileInputStream dan FileOutputStream untuk
membaca dari sebuah file khusus dan menyalin isi dari file ini ke file yang lain.
import java.io.*;
class CopyFile {
void copy(String input, String output) {
FileInputStream inputStr;
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);
}

Contoh Modifikasi InputStream/OutputStream


Contoh berikutnya menggunakan class PushbackInputStream yang memanfaatkan
sebuah object FileInputStream dan class PrintStream.
import java.io.*;
class CopyFile {
void copy(String input) {
PushbackInputStream inputStr;
PrintStream outputStr;
int data;
try {
inputStr = new PushbackInputStream(new
FileInputStream(input));
outputStr = new PrintStream(System.out);
while ((data = inputStr.read()) != -1) {
outputStr.println("read data: " + (char) data);
inputStr.unread(data);
data = inputStr.read();
outputStr.println("unread data: " + (char) data);
}
inputStr.close();
outputStr.close();
} catch (IOException ie) {
ie.printStackTrace();
Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3


}
}

public static void main(String args[]) {


String inputFile = args[0];
CopyFile cf = new CopyFile();
cf.copy(inputFile);
}

Mendapatkan Input dari Keyboard


1. Menggunakan BufferedReader untuk mendapatkan input
Pada bagian ini, kita akan menggunakan kelas BufferedReader yang berada di java.io
package untuk mendapatkan input dari keyboard. Berikut ini adalah langkah-langkah
yang diperlukan untuk mendapatkan input dari keyboard:
a. Tambahkan di bagian paling atas code anda: import java.io.*;
b. Tambahkan statement ini: BufferedReader dataIn = new BufferedReader(new
InputStreamReader( System.in) );
c. Deklarasikan variabel String temporer untuk mendapatkan input, dan gunakan
fungsi readLine() untuk mendapatkan input dari keyboard. Anda harus
mengetikkannya di dalam blok try-catch:
try{
String temp = dataIn.readLine();
}
catch( IOException e ){
System.out.println(Error in getting input);
}
Berikut ini adalah source code selengkapnya:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class GetInputFromKeyboard
{
public static void main( String[] args ){
BufferedReader
dataIn
=
new
BufferedReader(new
InputStreamReader( System.in) );
String name = "";
System.out.print("Please Enter Your Name:");
try{
name = dataIn.readLine();
}catch( IOException e ){
System.out.println("Error!");
}
System.out.println("Hello " + name +"!");
}
}
Berikutnya akan dijelaskan setiap baris dari code:
Statement,
import java.io.BufferedReader;
Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3


import java.io.InputStreamReader;
import java.io.IOException;
menjelaskan
bahwa
kita
akan
menggunakan
kelas
BufferedReader,
InputStreamReader dan IOException yang berada di java.io package. Java Application
Programming Interface (API) sudah berisi ratusan kelas yang bisa digunakan untuk
program anda. Kelas-kelas tersebut dikumpulkan ke dalam packages.
Packages memiliki kelas yang mempunyai fungsi yang saling berhubungan. Seperti
pada contoh di atas, java.io package mengandung kelas-kelas yang memungkinkan
program untuk melakukan input dan output data. Statement di atas juga dapat
ditulis,
import java.io.*;
yang akan mengeluarkan semua kelas yang berada pada paket, dan selanjutnya kita
bisa menggunakan kelas-kelas tersebut pada program kita.
Dua statement selanjutnya,
public class GetInputFromKeyboard
{
public static void main( String[] args ){
Statement ini menyatakan bahwa kita mendeklarasikan sebuah class bernama
GetInputFromKeyboard dan kita mendeklarasikan main method.
Pada statement,
BufferedReader dataIn = new BufferedReader(new
InputStreamReader( System.in) );
kita mendeklarasikan
BufferedReader.

sebuah

variabel

bernama

dataIn

dengan

tipe

kelas

Sekarang, kita akan mendeklarasikan variabel String dengan identifier name,


String name = "";
Statement di atas merupakan tempat untuk menyimpan input dari user. Variabel
name diinisialisasi sebagai String kosong "". Sebaiknya kita selalu menginisialisasi
sebuah variabel setelah kita mendeklarasikannya. Baris berikutnya adalah
memberikan output string pada layar menanyakan nama user.
System.out.print("Please Enter Your Name:");
Sekarang, block di bawah ini merupakan try-catch block,
try{

name = dataIn.readLine();
}catch( IOException e ){
System.out.println("Error!");
}
Pada baris ini menjelaskan bahwa kemungkinan terjadi error pada statement
Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3


name = dataIn.readLine();
akan ditangkap. Hal yang perlu dicatat adalah anda perlu menambahkan kode ini
untuk menggunakan readLine() method dari BufferedReader untuk mendapatkan
input dari user.
Selanjutnya statement,
name = dataIn.readLine();
method di atas memanggil dataIn.readLine(), mendapatkan input dari user dan
memberikan sebuah nilai String. Nilai ini akan disimpan ke dalam variabel name,
yang akan kita gunakan pada statement akhir untuk menyambut user,
System.out.println("Hello " + name + "!");
2. Menggunakan JOptionPane untuk mendapatkan input
Cara lain untuk mendapatkan input dari user adalah dengan menggunakan kelas
JoptionPane yang didapatkan dari javax.swing package. JoptionPane membuat
kemudahan dengan memunculkan dialog box standar yang memberikan kepada user
sebuah nilai atau menginformasikan sesuatu. Berikan kode berikut ini,
import javax.swing.JOptionPane;
public class GetInputFromKeyboard
{
public static void main( String[] args ){
String name = "";
name = JoptionPane.showInputDialog("Please enter your
name");
String msg = "Hello " + name + "!";
JOptionPane.showMessageDialog(null, msg);
}
}
Akan menghasilkan output,

Statement pertama,
Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3


import javax.swing.JOptionPane;
Menjelaskan bahwa kita mengimport kelas JoptionPane dari javax.swing package.
Bisa juga ditulis,
import javax.swing.*;
statement selanjutnya,
name = JOptionPane.showInputDialog("Please enter your name");
membuat sebuah JOptionPane input dialog, yang akan menampilkan dialog dengan
sebuah pesan, sebuah textfield dan tombol OK seperti pada gambar. Hasil dari dialog
tersebut adalah String dan disimpan ke dalam variabel name. Sekarang kita
membuat pesan selamat datang, yang akan disimpan ke dalam variabe msg,
String msg = "Hello " + name + "!";
Baris selanjutnya adalah menampilkan sebuah dialog yang memilki sebuah pesan
dan tombol OK,
JOptionPane.showMessageDialog(null, msg);
D. Buffer
Proses kooperatif adalah proses yang saling mempengaruhi satu sama lain. Proses
kooperatif ini dapat berbagi sumber daya secara langsung atau berbagi data melalui
pertukaran pesan. Dengan demikian perlu dilakukan sinkronisasi untuk mencegah
timbulnya data yang tidak konsisten akibat akses data secara konkuren oleh lebih dari 1
proses. Pesan-pesan yang dipertukarkan antar proses membutuhkan antrian sementara
yang sering kita sebut sebagai penyangga atau buffer. Buffer dapat dibagi menjadi
3 jenis sesuai kapasitasnya, yaitu buffer yang kapasitasnya 0; buffer yang kapasitasnya
tak hingga; serta buffer yang kapasitasnya dibatasi sebanyak n. Buffer dengan
kapasitas terbatas inilah yang disebut sebagai bounded-buffer.
Salah satu ilustrasi proses yang menggunakan bounded buffer adalah proses
produsen-konsumen, dimana produsen menaruh data ke dalam buffer untuk kemudian
diambil oleh konsumen. Masalah yang timbul adalah buffer yang kemudian menjadi
critical section. Pada satu waktu, hanya 1 proses yang boleh memasuki critical
section, dengan demikian buffer hanya bisa diakses oleh produser saja atau konsumen
saja pada 1 waktu. Masalah berikutnya adalah ketika produsen ingin menaruh data,
namun buffer penuh, atau ketika konsumen ingin mengambil data, namun buffer
masih kosong. Ini adalah salah satu masalah sinkronisasi klasik yang dikenal pula
dengan nama bounded-buffer problem atau producer-consumer problem.
Penggunaan Semafor
Untuk mensinkronisasikan proses produsen dan proses konsumen ini, digunakan
perangkat sinkronisasi semafor. Semafor yang digunakan adalah:
1. mutex. Binary semaphore yang dapat bernilai 0 atau 1 untuk menjaga agar pada
suatu waktu buffer hanya dapat diakses oleh satu proses saja. Mutex bernilai 0 jika
buffer sedang diakses sebuah proses, dan bernilai 1 jika tidak.
2. tempat_kosong. Counting semaphore berisi data tempat kosong pada buffer.
3. tempat_terisi. Counting semaphore berisi data tempat terisi pada buffer.
Kejadian dimana produsen ingin mengakses buffer, namun buffer sedang diakses oleh
konsumen
Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3

Produsen Menunggu Konsumen


Dengan demikian produsen akan menunggu jika mendapatkan buffer sedang dipakai
konsumen dan atau buffer penuh. Buffer yang sedang dipakai konsumen ditandai
dengan semafor mutex yang bernilai 0; dan buffer yang penuh ditandai dengan semafor
tempat_kosong yang bernilai 0, yang berarti tempat kosong di buffer ada 0. Konsumen
akan menunggu juga jika buffer sedang dipakai oleh produsen atau jika buffer kosong.
Buffer kosong ditandai dengan semafor tempat_terisi yang bernilai 0, yang berarti
tempat terisi ada 0.
Kejadian dimana konsumen ingin mengakses buffer, namun buffer sedang diakses oleh
produsen.

Konsumen Menunggu Produsen


Produsen tidak bisa menaruh apapun di buffer ketika buffer penuh (tidak bisa menimpa
data yang ada).

Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

Algoritma dan Pemrograman 3

Produsen Menunggu Buffer Penuh


Konsumen tidak bisa mengambil apapun dari buffer ketika buffer kosong

Konsumen Menunggu Buffer Kosong


Jika sebuah proses mendapat akses buffer, proses tersebut harus men-set mutex
menjadi 0 sebagai tanda bahwa buffer sedang ia gunakan dan ketika selesai proses
tersebut akan mengembalikan nilai mutex menjadi 1 agar buffer dapat diakses oleh
proses yang lain.
Daftar pustaka:
http://dahlan.web.id/files/java1
http://dahlan.web.id/files/java2
http:risdawati.staff.gunadarma.ac.id

Pertemuan 8 - Jeje, SKom, MMSI Universitas Gunadarma

10

Anda mungkin juga menyukai