Selasa, 13 Maret 2012

Event Handling Pada Java(J2ME)

Event Handling
Event berguna untuk menangani interaksi user dengan program, misalnya user memilih
sebuah menu dalam aplikasi MIDlet.Untuk menangani event perlu
mengimplementasikan interface CommandListener dan atau ItemListener.
CommandListener berfungsi untuk menangani jika user memilih Command tertentu
sedangkan ItemListener berfungsi untuk menangani jika user mengubah nilai seperti
misalnya mengubah pilihan pada ChoiceGroup.
Untuk memberikan gambaran sebuah event bekerja, perhatikan contoh berikut.




import javax.microedition.MIDlet.*;
import javax.microedition.lcdui.*;
public class NotHelloWorld2 extends MIDlet implements CommandListener{
private Command cmdExit;
private Display display;
public NotHelloWorld2()
{
display = Display.getDisplay(this);
cmdExit = new Command("Exit", Command.SCREEN,2);
}
public void startApp()
{
TextBox t = new TextBox("Not ","Not Hello World",256,0);
t.addCommand(cmdExit);
t.setCommandListener(this);
display.setCurrent(t);
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
public void commandAction(Command cmd,Displayable disp)
{
if(cmd==cmdExit)
{
destroyApp(false);
notifyDestroyed();
}
}
}
Pemrograman aplikasi wireless dengan Java/J2ME 24
Pada contoh kedua ini, kita tambahkan sebuah Command untuk keluar dari aplikasi
yang telah kita buat pada contoh 1. Ketika program pertama kali dipanggil, maka state
berada pada Aktif, disini sebuah TextBox dan Command dibuat. Kemudian program
menunggu respon dari user dengan mengimplementasikan CommandListener. Ketika
user menekan Command “cmdExit” , maka program memanggil
metodh(destroyApp) untuk membunuh MIDlet.

Contoh Event Handling

Event Handling merupakan konsep penanganan suatu action yang terjadi. Jadi suatu program akan berjalan saat sesuatu terjadi, misalnya saat tombol diklik, saat combo box dipilih dan sebagainya. Java memiliki beberapa jenis Event Handling, salah satunya adalah class ActionListener yang menangani aksi terhadap tombol. Berikut ini contoh programnya:
Tampilan:
contoh-program-event-handling-java

Program:
01import java.awt.*;
02import java.awt.event.*;
03import javax.swing.*;
04 
05public class ClickMe extends JFrame implements ActionListener {
06    private JButton tombol;
07 
08    public ClickMe() {
09        super ("Event Handling");  
10 
11        Container container = getContentPane();
12        container.setLayout(new FlowLayout());     
13 
14        tombol = new JButton ("Click Me!");
15        tombol.addActionListener(this);
16        container.add(tombol);     
17 
18        setSize (200,100);
19        setVisible (true);
20    }
21 
22    public static void main (String arg[]) {
23        ClickMe test = new ClickMe();
24        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
25    }
26 
27    public void actionPerformed (ActionEvent e) {
28        if (e.getSource() == tombol) {
29            JOptionPane.showMessageDialog(null, "You click me, guys !!!");
30        }
31    }
32}
Selamat mencoba

AWT dan Swing

Perbedaan antara AWT dan Swing

AWT dan Swing menyediakan komponen GUI yang dapat digunakan dalam membuat aplikasi Java dan applet. Tidak seperti beberapa komponen AWT yang menggunakan native code, keseluruhan Swing ditulis menggunakan bahasa pemrograman Java. Swing menyediakan  implementasi platform-independent dimana aplikasi yang dikembangkan dengan platform yang berbeda dapat memiliki tampilan yang sama. Begitu juga dengan AWT menjamin tampilan look and feel pada aplikasi yang dijalankan pada dua mesin yang berbeda menjadi terlihat sama. Swing API dibangun dari beberapa API yang mengimplementasikan beberapa jenis bagian dari AWT.  Namun pada dasarnya, kompondn AWT dapat digunakan bersama dengan komponen Swing.

 Perbedaan antara Kontainer dan Komponen Swing

 1. Kontainer  

Kontainer merupakan komponen yang dapat berisi komponen lain. Kontainer juga merupakan turunan dari java.awt.Container. Kontainer menggunakan Layout Manager to dan memposisikan dan mengatur ukuran komponen di dalamnya. Contoh: Label di dalam Window.

 2. Komponen Swing   

Swing menyediakan banyak komponen standar.  Komponen ini dibangun dengan konsep MVC. Swing menyediakan Container yang bisa menerima komponen di dalamnya.



 Desain aplikasi GUI menggunakan AWT

Salah satu contoh source code dari penggunanaan AWT dalam menampilkan Panel : 
 
import java.awt.Frame;
public class GraphicPanel extends Panel {
    public GraphicPanel() {
          setBackground(Color.black);
    }
    public void paint(Graphics g) {
    g.setColor(new Color(0,255,0)); //green
    g.setFont(new Font("Helvetica",Font.PLAIN,16));
    g.drawString("Hello GUI World!", 30, 100);
    g.setColor(new Color(1.0f,0,0)); //red
    g.fillRect(30, 100, 150, 10);
    }
    public static void main(String args[]) {
    GraphicPanel gp = new GraphicPanel();
    f.add(gp);
    f.setSize(600, 300);
    f.setVisible(true);
    }  
}
 
        Tanpa men-drag object panel pada library , kita dapat menambahkannya di program kita dengan code di atas. Tapi ya lumayan mikir sih ^^ , soalnya kalau saya pilih cara yang lebih efisien.



Desain aplikasi GUI menggunakan Swing

Salah satu contoh source code dari penggunaan Swing dalam menampilkan JOptionPane :

import javax.swing.*;
import java.awt.*;
public class JOptionPaneDemo {
    JOptionPane optionPane;
    public JOptionPaneDemo() {
     }
       void launchFrame() {
        optionPane = new JOptionPane();
        String name = optionPane.showInputDialog("Hi, what's yourname?");
        optionPane.showMessageDialog(null,"Nice to meet you, " + name + ".", "Greeting...",optionPane.PLAIN_MESSAGE);
        System.exit(0); }



 What’re flow layout, border layout, dan grid layout ?



 Aplikasi GUI lainnya

 
1. SWT (The Standard Widget Toolkit)

        SWT adalah komponen perangkat lunak yang memberikan fungsi widget asli untuk platform Eclipse dengan cara sistem operasi independen. Hal ini sejalan dengan AWT / Swing di Java dengan perbedaan : SWT menggunakan . Bahkan dalam situasi yang ideal, library ber-platform sangat sulit untuk writer dan reader. Hal ini karena kompleksitas yang melekat pada sistem widget dan banyak perbedaan halus antara platform. Ada beberapa pendekatan dasar yang telah membantu secara signifikan untuk mengurangi kompleksitas masalah dan memberikan library berkualitas tinggi.


2. QT ( )
 
 Teknologi terbaru di Java                                         &nbrp;                          


Struts 2.1 Java Framework Terbaru Dirilis

                Struts merupakan salah satu Java MVC web framework terpopuler yang menginspirasi banyak framework lain. Struts 2 merupakan penggabungan dari Struts dengan Webwork 2 sehingga menghasilkan framework yang lebih mudah digunakan dan lebih mencapai tujuan dari Struts dibuat.
 Rilis ini merupakan versi upgrade yang signifikan dan dirilis plugin baru untuk konfigurasi tanpa XML yang dinamakan Convention Plugin, selain itu juga terdapat plugin REST dan Javatemplates.
Fungsi Ajax dijadikan sebagai plugin sehingga Struts lebih mudah dimaintain. dan banyak bug yang diperbaiki untuk rilis ini.
Rilis 2.1.x memerlukan:
- Servlet API 2.4
- JSP API 2.0
- Java 5

Enkripsi dan Dekripsi

Enkripsi :  proses penggunaan algoritma yang kompleks untuk mengkonversi pesan ( plaintext ataucleartext ) ke suatu pesan terenkripsi ( chipertext ). Hal ini ditujukan untuk mengamankan suatu informasi dengan membuat informasi tersebut tidak dapat dibaca tanpa bantuan pengetahuan khusus . Enkripsi dapat digunakan untuk tujuan keamanan , tetapi teknik lain masih diperlukan untuk membuat komunikasi yang aman , terutama untuk memastikan integritas dan autentukasi dari sebuah pesan .

Deskripsi :  proses penggunaan algoritma yang kompleks untuk mengkonversi pesan terenkripsi ( chipertext ) ke suatu pesan ( plaintext atau cleartext ).


Untuk paket yang mendefinisikan class-class untuk encrypt dan decrypt data , java mengimplementasikan  Java Cryptography Extension (JCE) di paket dan subpaket javax.crypto .


Contoh Enkripsi dan Deskripsi :
mport javax.swing.*;
import java.awt.*;
import java.io.*;
import java.awt.event.*;
public class Enkripsi extends JFrame{
static String teks=”";
private JLabel LabelPesan=new JLabel(“Pesan:”);
private static JTextField TeksImputan=new JTextField(40);
private JLabel LabelPergeseran=new JLabel(“Pergeseran”);
private static JTextField TeksPergeseran=new JTextField(“2″);
private JLabel LabelEnkripsi=new JLabel(“Hasil Enkripsi:”);
private static JTextField TeksHasilEnkripsi=new JTextField(40);
private JButton TombolEnkripsi=new JButton(“Enkripsi”);
private JButton TombolReset=new JButton(“Reset”);
private JPanel PanelPesan_Label=new JPanel();
private JPanel PanelTombol=new JPanel();
public Enkripsi(){ //mengatur GUI
PanelTombol.setLayout(new GridLayout(6,1,30,10));
PanelTombol.add(LabelPesan);
TeksImputan.setToolTipText(“Isi pesan yang akan dienkripsi di sini”);
PanelTombol.add(TeksImputan);
PanelTombol.add(LabelPergeseran);
TeksPergeseran.setToolTipText(“Masukkan pergeseran di sini”);
PanelTombol.add(TeksPergeseran);
PanelTombol.add(LabelEnkripsi);
TeksHasilEnkripsi.setToolTipText(“Anda tidak perlu mengisi bagian ini. Bagian ini akan terisi setelah Anda melakukan enkripsi.”);
PanelTombol.add(TeksHasilEnkripsi);
setLayout(new FlowLayout(FlowLayout.LEFT,10,10));
add(PanelTombol);
TombolEnkripsi.setToolTipText(“Klik untuk melakukan enkripsi pesan”);
PanelPesan_Label.add(TombolEnkripsi);
TombolReset.setToolTipText(“Klik untuk menghapus semua pesan”);
PanelPesan_Label.add(TombolReset);
setLayout(new FlowLayout(FlowLayout.CENTER));
add(PanelPesan_Label,BorderLayout.SOUTH);
TombolEnkripsi.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try
{
int pergeseran=Integer.valueOf(TeksPergeseran.getText());
if(pergeseran>0 && pergeseran0){
for(int i=0;i=48 && kode_ASCII=65 && kode_ASCII=97 && kode_ASCII=33 && kode_ASCII=58 && kode_ASCII=91 && kode_ASCII=123 && kode_ASCII<=126)
ArrayHuruf[i]=(char)((kode_ASCII-123+pergeseran)%4+123);
}
}
teks=String.valueOf(ArrayHuruf);
}
else{
JOptionPane.showMessageDialog(null,”Error!!\nMasukkan pesan yang akan dienkripsi dulu”,”ERROR”,JOptionPane.ERROR_MESSAGE);
}
return teks;
}
}

Stream I/O


Pengertian I/O Stream
 I/O -> adalah singkatan dari Input / Output dan mengacu pada transfer data ke atau dari aplikasi.
Stream ->  Keadaan dari sebuah file atau sebuah device yang memungkinkan rangkaian item dapat dibaca atau ditulis


Input atau Stream Sumber
- Dari stream ini dapat membaca
- Superclass dari semua input streams:
* Class InputStream
* Class Reader
Output
- Kita dapat menulis pada stream ini
- Class root dari stream ini:
* Class OutputStream
* Class Writer 
Overview I/O 
1. Konsep Stream
2. Kelas Abstrak pada java.io
3. Reader/Writer
4. Input dan Output file
5. Wrapper

1. Konsep Stream
Stream adalah suatu abstraksi untuk data input dan output.
– Tidak peduli dari mana input berasal atau kemana output akan pergi 
  
Package java.io
• Package java.io berisi kelas yang berhubungan dengan I/O di Java
• Dibagi menjadi beberapa kelas
– Reader/Writer dan turunannya
– InputStream/OutputStream dan turunannya
– I/O Network (socket TCP/IP)
– Exception


2. Kelas Abstrak pada java.io
• Ada 4 kelas abstrak dasar
– Reader
– Writer
– InputStream
– OutputStream
• Reader dan Writer digunakan untuk data Teks
• InputStream dan OutputStream digunakan untuk data biner

3. Kelas Reader/Writer
• Kelas Reader/Writer bekerja pada stream teks (bahasa apapun)
• Disebut juga character stream
• Menangani konversi teks Unicode secara otomatis
• Jangan dipertukarkan dengan InputStream/OutputStream secara sembarangan
• Hasilnya bisa error 

Diagram Kelas Reader dan Turunannya 


Diagram Kelas Writer dan Turunannya
Kelas InputStream/OutputStream
• InputStream dan OutputStream digunakan untuk mengakses informasi non teks (biner)
– disebut juga sebagai byte stream
– COntoh data biner: File EXE, file GIF
• InputStream/OutputStream Tidak menangani konversi teks Unicode secara otomatis

Diagram Kelas InputStream dan turunannya
Diagram Kelas OutputStream dan turunannya
4. Input dan Output File
• Gunakan FileInputStream dan FileOutputStream untuk membaca/menulis file non teks
• Gunakan FileReader/FileWriter untuk file teks

Contoh Membuka file untuk dibaca
• cara untuk membuka file (untuk dibaca):
FileInputStream s = new
FileInputStream(“test.dat”);
• Cara untuk membaca satu byte: int a = s.read()
• Tersedia juga method untuk membaca array of byte
• Prototype read adalah : int read()
– Perlu dicast ke byte untuk membaca sebagai byte
– Memakai int supaya cukup merepresentasikan -1

Contoh Membuka file untuk ditulis
• Cara untuk membuka file (untuk ditulisi):
FileOutputStream out = new
FileOutputStream(“test.out”);
• Intruksi untuk menulis satu byte:
– Out.write(‘a’)
• Tersedia juga method untuk menulis array of byte

Perhatikan:
• Membaca dan menulis selalu perlu try … catch
• Method read() dan write() melempar Exception java.lang.IOException
• Kasus khusus: read() mengembalikan
-1 pada end of file
• EOF (End Of File atau EndOfStream) tidak menimbulkan exception

Memakai FileReader/FileWriter
• Sama seperti contoh sebelumnya
– Ganti nama kelas FileInputStream
dengan FileReader dan FileOutputStream
dengan FileWriter
– Tetap gunakan read/write
• Perhatikan bahwa
– Nilai kembalian

5. Wrapper• Stream dapat dikomposisi atau difilter atau dibungkus untuk menghasilkan stream yang lebih kompleks
• Konsep ini mirip dengan pipe di
Unix/Windows
• Contoh:
– BufferedReader yang menyediakan readLine()
– PipedWriter/PipedReader untuk mempipe suatu stream
– PrintStream/PrintWriter untuk menulis ke stream dengan mudah

 Contoh Wrapper: BufferedReader
• Perhatikan potongan kode berikut:
BufferedReader br = new
BufferedReader(new
FileReader(“hello.txt”));
//membaca 1 baris
String teks = br.readLine();
• BufferedReader membungkus (wraps) FileReader untuk menyediakan method readLine()

Contoh Wrapper: PrintWriter
• Perhatikan potongan kode berikut:
PrintWriter pr = new PrintWriter(new FileWriter(“hello.txt”)); //Menulis 1 baris
pr.println(“Hello “);
• PrintWriter membungkus (wraps) FileWriter untuk menyediakan method print(), println() untuk semua tipe data dasar 

Membaca dari Console [1]
• Java menyediakan System.in yang class-nya adalah InputStream
• Membaca teks dari console
• Untuk membaca teks, perlu di-wrap dengan BufferedReader
• Tapi BufferedReader hanya bisa mewrap suatu class turunan Reader
• InputStream perlu di-wrap dengan InputStreamReader

Membaca dari console [2]
• Buat BufferedReader yangmembungkus InputStreamReader yang membungkus System.in
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in))
• Untuk membaca:
String s = br.readLine();
• Untuk membaca integer, teks dibaca dengan method yang sama, lalu dikonversi dengan method Integer.parseInt()

NIO (Nonblocking I/O)
• JDK 1.4 (nama Kode: Merlin) ke atas menyediakan NIO
– Ada di package java.nio
• Improvement:
– Non blocking I/O
– Buffer
– Regular Expression

[2] String dan StringBuffer
 *String
• Merupakan kelas khusus di Java (ditangani secara transparan)
• Sifatnya immutable (tidak bisa diubah)
• Memiliki berbagai method untuk memiliki manipulasi String

*Literal String
• Harap diingat lagi bahwa:
– Setiap Literal String adalah sebuah objek
String. Contoh:
String teks = “Hello”;
System.out.println(teks.length());
– Sama dengan
System.out.println(“Hello”.length()); 

*Sifat Immutable String
• String sebenarnya tidak dapat diubah, namun Java memungkinkan String seolah-olah diubah, Contoh:
– Jika dilakukan ini:
String judul = "Judul :";
judul += "Eyes On Me";
– Maka sebenarnya yang dilakukan adalah ini
String judul = "Judul :";
judul = judul.concat("Eyes On Me"); 

*Operasi String Tidak Optimal
• String baru diciptakan (string yang lama tetap ada di memori, dan dibuang ketika terjadi garbage collection)
• Untuk operasi yang banyak melibatkan perubahan string, sebaiknya menggunakan StringBuffer 

*StringBuffer
• StringBuffer mirip dengan String
• Sifatnya mutable
• Tidak ditangani secara transparan oleh Java (harus dilakukan secara manual)
• Lebih cepat untuk manipulasi string yang memerlukan perubahan pada String. 

*Sifat mutable StringBuffer
• Untuk mengubah StringBuffer tidak perlu objek baru
– Contoh :
StringBuffer nama = new StringBuffer("mataku");
nama.setCharAt(4, 'm');
• Untuk mengubah String selalu butuh objek baru (objek lama diubah melalui assignment) 

*Method yang penting
• Beberapa method String dan StringBuffer yang penting adalah:
– length(): panjang string
– replace(): mengganti suatu karakter
– charAt(): mengakses karakter di posisi tertentu
– trim(): menghilangkan spasi di awal dan di akhir string
• Perhatikan bahwa meskipun namanya sama, sifat keduanya berbeda
– String menciptakan objek baru, sedangkan StringBuffer tidak 

*Membandingkan String
• Method equals() membandingkan string untuk memeriksa kesamaan
• Method equalsIngnoreCase() melakukan hal yang sama, tapi besar kecil huruf tidak diperhatikan
• Method compareTo() menghasilkan 0 jika string sama, >0 jika String1>String2 dan <0 jika String1<String2 

[3] Kelas Matematik 
*Matematika di Java
• Fungsi matematika ada di package java.math
• Meliputi fungsi trigonometri, dan fungsi matematika standar
– Berisi juga konstanta penting (seperti PI dan e)
– Sebagian besar hasil method adalah bilangan riil (tipenya double ) 

*Memformat Hasil
• Class math tidak menyediakan cara untuk memformat keluaran (output) sehingga dapat dicetak dengan rapi
• Perlu class DecimalFormat untuk melakukan format terhadap output (DecimalFormat ada pada package java.text) 

*Beberapa fungsi matematika yang penting
• Method pow() untuk pangkat
• Fungsi-fungsi trigonometri (sin, cos, tan)
• Pembulatan hasil, meliputi
– ke atas : ceil, ke bawah: floor, dan terdekat : round
• Logaritma 

*Bilangan Acak
• Bilangan acak sangat penting dalam simulasi, permainan, dan enkripsi
• Bilangan acak dihasilkan dengan kelas Random
• Kelas Random tidak berada dalam package java.math, tapi dalam kelas java.util
– Contoh:
Random r = new Random();
int x = r.nextInt(10); //random 0..9 

*BigInteger dan BigDecimal
• BigInteger
– Integer presisi tak hingga
– Berisi semua method untuk operasi integer dan bahkan method untuk mengecek probabilitas suatu bilangan adalah prima
• BigDecimal
– Bilangan floating point presisi tak hingga
– Semua method untuk doube/float 

[4] Utility 
*Utility
• Berbagai macam kelas yang tidak cocokdimasukkan ke package tertentu
• Beberapa yang akan dibahas
– Hashtable
– Stack
– Vector
– Calendar
• Kelas lain yang cukup berguna untukdipelajari: List, Tree 

*Hashtable
• Digunakan untuk menyimpan data dengan assosiasi tertentu
– Misal nama panggilan diassosiasikan dengan nama lengkap
• Memetakan suatu nilai String dengan suatu Objek tertentu (Objek apa saja, termasuk juga Objek String)
• Method yang dipakai adalah put dan get

*Contoh
import java.util.Hashtable;
class HashtableDemo {
public static void main(String argv[]) {
Hashtable h = new Hashtable();
h.put("Linux", "Torvalds");
h.put("Windows", "Microsoft");
String nama = (String) h.get("Linux");
if (nama!=null) {
System.out.println(nama);
}
}

*Stack
• Struktur data LIFO (Last In First Out)
– Data yang masuk pertama akan keluar terakhir
• Memakai Method push, untuk meletakkan satu item di Stack dan pop untuk mengeluarkan satu item dari stack
– Ada juga method peek() untuk mengintip top of stack dan search untuk mencari elemen di Stack() 

*Contoh Stack
import java.util.Stack;
class StackDemo {
public static void main(String argv[]) {
Stack s = new Stack();
s.push("Salamku Kawan");
s.push("Jangan Takut Gelap");
s.push("Gembira berkumpul");
while (!s.empty()) {
System.out.println(s.pop());
}
}

*Vector
• Struktur data seperti array
• Sifatnya dinamis (ukurannya tidak tetap), berubah sesuai dengan elemen yang ditambahkan ke (atau dihapus dari)
Vector tersebut
• Dapat dimanipulasi dengan mudah (elemen-elemennya dapat di add, remove, atau diubah dengan mudah) 

*Contoh Vector
import java.util.Vector;
import java.util.Enumeration;
class VectorDemo {
public static void main(String argv[]) {
Vector v = new Vector();
/* tambahkan elemen */
v.add("Pelangiku");
v.add("Andai Aku Besar Nanti");
v.add("Dua Balerina");
for (int i=0; i<v.size(); i++){
System.out.println(" - " + v.elementAt(i));
}
}


*Calendar
• Dipakai untuk menangani perhitungan kalender Masehi (Gregorian)
– Dirancang untuk mendukung kalender lain
• Menyediakan informasi mengenai tanggal, (date) dan waktu (time) saat ini (misalnya hari apa, bulan ke berapa, hari keberapa dalam tahun ini)
• Menyediakan sarana untuk penghitungan waktu

*Contoh Calendar
import java.util.Calendar;
class Kalender {
public static void main(String argv[]) {
Calendar c = Calendar.getInstance();
System.out.println("Hari ini :");
System.out.println("Hari ke“
+c.get(Calendar.DAY_OF_WEEK)+" dalam
minggu ini");
}}

CONTOH PENERAPAN
package testjeni_02;
import java.io.*;

/**
 *
 * @author NieNov
 */
public class FileInfoClass {
public static void main(String args[]) {
String fileName = "C://Price Tag.txt";
File fn = new File(fileName);
System.out.println("Name: " + fn.getName());
if (!fn.exists()) {
System.out.println(fileName + " does not exists.");
/* membuat sebuah temporary directory . */
System.out.println("Creating temp directory...");
fileName = "temp";
fn = new File(fileName);
fn.mkdir();
System.out.println(fileName +
(fn.exists()? "exists": "does not exist"));
System.out.println("Deleting temp directory...");
fn.delete();
System.out.println(fileName +
(fn.exists()? "exists": "does not exist"));
return;
}
System.out.println(fileName + " is a " +
(fn.isFile()? "file." :"directory."));
if (fn.isDirectory()) {
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]);
}
}
if (!fn.canRead()) {
System.out.println(fileName + " is not readable.");
return;
}
System.out.println(fileName + " is " + fn.length() +
" bytes long.");
System.out.println(fileName + " is " + fn.lastModified()
+ " bytes long.");
if (!fn.canWrite()) {
System.out.println(fileName + " is not writable.");
}
}
}

dan outputnya