Cahya Tri Jatmiko/13293132

Mengatasi E-mail Sampah
Dengan memanfaatkan Bahasa Pemrograman Java

Teknologi komputer telah membawa banyak manfaat dalam kehidupan kita sehari-hari : komunikasi yang efektif, “streamlined work production”, dan berbagai informasi yang melimpah yang dapat diakses kapan saja. Namun selain bisa memperoleh keuntungan tersebut ada beberapa hal yang kurang menyenangkan dalam hal pemanfaatan teknologi tersebut, salah satunya -- electronic junk mail atau e-mail sampah !. Untungnya kita memiliki suatu cara untuk melawan penyakit yang satu ini. 
Tulisan ini pertama akan mengantar anda melihat-lihat lebih dekat pada paket Java class library I/O dan model stream. Kita akan lihat bagaimana cara kerjanya dan apa perbedaan implementasi I/O dalam Java 1.0.2 dan Java 1.1 . Kemudian bagaimana menggunakannya untuk membuat suatu  electronic junk mail filter. 
"Work at home and make millions"
"Miracle diet -- lose 20 pounds in 1 week"
B
"Hot XXX babes and hunks want to meet YOU"
Bagaimana kedengarannya ? (mungkin untuk beberapa orang cukup familiar…) Namun sejumlah e-mail yang tidak dikehendaki itu sebagian sangat ofensif. Bila kita subscribe ke mailing list tertentu semua surat yang dialamatkan ke milis tersebut juga masuk ke mailbox kita, padahal tidak semua surat tersebut kita baca. Nah, daripada mendapat kerja tambahan menghapus sampah tersebut kita membuat suatu filter dengan menggunakan Java. Memang di negara kita masih jarang merasakan hal ini, tapi di luar seperti Amerika kadang orang mendapat e-mail yang jelas-jelas tidak kita kehendaki. Mungkin email tersebut dari perusahaan tertentu bahkan mungkin juga berisi iklan site pornografi ! Masalah tersebut bagi yang telah merasakannya memang mengesalkan, banyak sekali (di Indonesia) milis-milis yang ramai dengan junk mail.
Identifikasi 
Salah satu metode yang efektif dan masuk akal adalah dengan meneliti setiap email kemudian diputuskan apakah kita akan menyimpan atau menghapusnya berdasarkan isi email tersebut. Ini pada dasarnya biasa kita lakukan secara manual ketika kita membaca sebuah email. secara manual kita menyaring surat-surat elektronik tersebut dengan melihat setiap karakter atau kata dalam kalimat untuk mengenali isi mail tersebut. Bila isinya sesuai dengan yang kita kehendaki kita simpan, selain itu kita buang ke tempat sampah. Tentunya pekerjaan tersebut cukup makan waktu apalagi kalau surat yang kita terima cukup banyak.
 Metode Evaluasi 
Sebelum kita memecahkan masalah di atas, ada baiknya kita mengerti tentang paket I/O  Java class library. I/O adalah singkatan dari Input/Output, yaitu informasi yang masuk dan keluar dari suatu program dan bagian dari program yang menangani informasi. 
Java class library input dan output yang dasarnya sangat sederhana, tapi sangat powerful disebut stream. Model stream seperti yang terlihat pada gambar di bawah menunjukkan informasi sebagai aliran dari suatu titik ke titik yang lain layaknya suatu aliran air dalam pipa PAM, dari suatu titik di sepanjang pipa tersebut seorang pengamat dapat melihat potongan-potongan informasi yang lewat, setiap potong pada setiap waktu dalam suatu urutan.
 
                                 Stream yang melewatkan informasi dari satu titik ke titik yang lain 	
Model tersebut dapat menggambarkanberbagai tipe informasi di dunia-nyata. Apakah kode yang berasal dari sebuah keyboard komputer, data audio yang berasal dari file audio, atau baris demi baris teks dari file teks, semuanya berbentu informasi stream. 
Suatu perangkat penting yang berhubungan dengan stream yaitu filter. Filter mengambil informasi yang melewatinya kemudian memproses dengan cara tertentu lalu mengirimkannya ke tahap selanjutnya. Gambar sederhana di bawah ini menunjukkan cara kerja stream. 
 
                               Sebuah filter menginterupsi suatu aliran informasi untuk pemrosesan 	
Kunci kekuatan model filter adalah dapat membentuk suatu filter gabungan yang sangat dari filter-filter yang sederhana. Seperti terlihat dalam gambar berikut :
 
                            Suatu filter kaskade 	
Java class library membagi streams dalam  dua jenis-- input dan output. Mungkin pembagian ini tidak penting dalam teori tapi sangat berguna dalam prakteknya. 
Kita akan menggunakan kelas stream dari Java class library untuk menyelesaikan masalah surat-surat sampah dengan alasan : 
1. 	Cukup mudah bagi kita untuk membayangkan email sebagai aliran baris demi baris dan kata demi kata ke dalam komputer kita.
2.	Kita ingin mengevaluasi email dengan cara  (1),  setiap saat informasi tersebut tiba pada komputer kita dan kita lihat apakah cocok dengan pola yang kita tentukan.
Kelas stream dalam detail 
Spesifikasi Java 1.1 mendeskripsikan dua buah set yang hampir identik dalam kelas stream input dan output. Set tersebut adalah  byte oriented dan  character oriented. Kelas byte-oriented stream memeiliki sedikit perbedaan dalam  Java 1.0.2. Kelas character-oriented stream  seluruhnya baru dalam spesifikasi 1.1. 
Dalam Java, semua kelas byte-oriented input stream dibagi dalam subkelas abstract class InputStream. Kelas  InputStream mendefinisikan metode dasar yang harus disediakan olah kelas input stream. Demikian juga dengan kelas byte-oriented output streams. 
Metode input stream yang umum 
Di bawah ini metode-metode umum pada semua input streams. Tiap deklarasi metode ditunjukkan cara kerjanya 
public int read() throws IOException 
•	Read sebuah byte tunggal dari input stream dan return. 
•	Returns -1 jika telah sampai bagian akhir input stream . 
•	Blocks (atau waits) sampai data muncul, jika perlu. 
•	Throw IOException jika terjadi error selama operasi read. 
public int read(byte [] rgb) throws IOException 
•	Read sekuens byte dari input stream dan tempatkan dalam array yang telah kita tentukan. 
•	Returns jumlah byte yang terbaca. 
•	Returns -1 jika bagian akhir input stream telah dicapai. 
•	Blocks (atau waits) sampai data memungkinkan, jika perlu. 
•	Throw IOException jika terjadi error selama operasi read. 
public int read(byte [] rgb, int nOff, int nLen) throws IOException 
•	Read sekuens bytes dengan panjang yang telah kita tentukan, dari input stream dan tempatkan dalam array yang telah ditentukan pada offset yang telah ditentukan pula. 
•	Return jumlah byte yang terbaca. 
•	Return -1 jika bagian akhir input stream telah dicapai. 
•	Block (atau waits) sampai data memungkinkan, jika perlu. 
•	Throw IOException jika terjadi error selama operasi read. 
public long skip(long n) throws IOException 
•	Skip sejumlah byte tertentu. 
•	Return jumlah byte yang terbaca. 
•	Return -1 jika bagian akhir input stream telah dicapai. 
•	Block (atau waits) sampai data memungkinkan, jika perlu. 
•	Throw IOException jika terjadi error selama operasi read. 
public int available() throws IOException 
•	Return jumlah byte yang dapat dibaca dari input stream tanpa read operation blocking. 
•	Throw IOException jika terjadi error selama operasi read. 
public void close() throws IOException 
•	Close input stream dan release beberapa  resources (operating system file , sebagai contoh) yang berasosiasi dengan input stream. 
•	Throw IOException jika terjadi error selama operasi read. 
public void mark(int nReadLimit) 
•	Mark posisi saat itu dalam input stream. Call berikutnya dari reset() akan menempatkan kembali input stream pada posisi ini. 
•	Tentukan jumlah byte yang mungkin membaca bekas mark sebelum mark itu invalidated. 
public void reset() throws IOException 
•	Tempatkan kembali input stream pada posisi terakhir ditandai. 
•	Throws IOException jika stream belum tertandai (marked), atau jika mark tersebut telah invalidated. 
public boolean markSupported() 
•	Mengindikasikan apakah input stream ini support terhadap operasi mark dan reset. 

Metode output stream yang umum 

public void write(int b) throws IOException 
•	Write sebuah byte tunggal ke output stream. 
•	Block (atau wait) sampai data benar-benar telah tertulis. 
•	Throw IOException jika suatu kesalahan terjadi selama operasi write 
public void write(byte [] rgb) throws IOException 
•	Write sebuah sekuens byte ke output stream. 
•	Block (atau wait) sampai data benar-benar tertulis. 
•	Throw IOException jika suatu kesalahan terjadi selama operasi write 
public void write(byte [] rgb, int nOff, int nLen) throws IOException 
•	Write sebuah sekuens byte dengan panjang yang telah ditentukan ke output stream, dimulai dari offset yang telah ditentukan. 
•	Block (atau wait) sampai data benar-benar tertulis. 
•	Throw IOException jika suatu kesalahan terjadi selama operasi write 
public void flush() throws IOException 
•	Flush output stream, segera tulis semua data di buffer. 
•	Throw IOException jika suatu kesalahan terjadi selama operasi.
public void close() throws IOException 
•	Close output stream dan release beberapa resource (seperti penanganan file operating ) yang berasosiasi dengan output stream. 
•	Throw IOException jika suatu kesalahan terjadi selama operasi.
Planning untuk solusi masalah
Proses konversi byte ke  char dalam Java 1.0.2  pada dasarnya akan mengalami kerusakan (membuat language's Unicode support sebenarnya tidak berguna). Untuk mendukung internasionalisasi, kekurangan tersebut telah di atasi dalam Java 1.1. Hasilnya adalah dua buah  API yang identik, di mana perbedaan hanya terletak pada metode konversi byte ke char.
Untuk dapat memperoleh code yang workable  dan untuk menunjukkan bagaimana perubahan API, kita lihat code dalam tiga paket. Kita dapat memanfaat paket tersebut sesuai dengan platform yang kita miliki. 
Paket pertama dengan Java 1.0.2. yang kedua dengan Java 1.1. dapat anda download di situs Java http://www.javaworld.com/javaworld/jw-10-1997/howto/j-1.0.2-1.1.tar.gz
Code ini tidak berjalan sebagai applet, jadi kita butuh akses ke Java Development Kit atau command-line environment yang mirip. 
Pertama, menggunakan metode yang sesuai dengan sistem anda, pilih paket di atas.
Kemudian, dari command line, eksekusilah Java runtime sebagai berikut : 
 % java Main [keyword] [keyword] ... < [email file]
Mungkin kita harus menentukan sejumlah kata kunci pada  command line. Program tersebut akan menjadi filter terhadap setiap kata kunci dan menghubungkan beberapa filter dalam sebuah stream. Program akan membaca dari input standard, mengirim data melalui stream, dan menulis ke output standard. Jika salah satu atau lebih filter mendeteksi kata kunci yang telah ditentukan, program akan mengadakan pengecualian (exception). Ini sangat sederhana tapi berguna dan efektif sekali.