• Tidak ada hasil yang ditemukan

136MASALAH PENANGANAN FILE DALAM JAVA

2. Pembahasan 1 Akses File Serial

2.3. File Akses Acak

File akses serial mudah untuk ditangani dan biasanya digunakan untuk aplikasi kecil atau untuk penyimpanan sementara pada aplikasi skala-besar. Namun, penggunaan file akses serial memiliki dua kekurangan, sebagai berikut: (i) Tidak dapat langsung mengakses data tertentu.

(ii) Tidak dapat menambah atau memodifikasi data di dalam suatu file.

File akses acak (atau file akses langsung) mengatasi kedua masalah di atas, walaupun juga memiliki kekurangan.

(i) Pada penggunaan umum, semua data (logis) dalam file

tertentu harus memiliki ukuran yang sama.

(ii) Juga pada penggunaan umum, suatu field string harus memiliki ukuran yang sama dengan semua data pada file tersebut.

Misalkan kita ingin membuat file akun dengan field berikut:

1. nomor akun (long);

2. nama lengkap (String); 3. inisial (String); 4. saldo (float).

Contoh kode programdapat dibuat sebagai berikut. import java.io.*;

import java.util.*; public class RanFile1

{ private static final int REC_SIZE = 48; private static final int SURNAME_SIZE = 15; private static final int NUM_INITS = 3; private static long acctNum = 0; private static String surname, initials; private static float balance;

public static void main(String[] args) throws IOException { RandomAccessFile ranAccts =

Gambar 2.Contoh output dari penggunaan metode File

Prosoding KNK surname = input.nextLine(); System.out.print("Initial(s): "); initials = input.nextLine(); System.out.print("Balance: "); balance = input.nextFloat(); //Now get rid of carriage return(!)... input.nextLine();

writeRecord(ranAccts); //Method defined below. System.out.print(

"\nDo you wish to do this again (y/n)? "); reply = input.nextLine(); }

while (reply.equals("y")||reply.equals("Y")); System.out.println();

showRecords(ranAccts); //Method defined below. } public static void writeRecord(RandomAccessFile file) throws IOException

{ //First find starting byte for current record... long filePos = (acctNum-1) * REC_SIZE; //Position file pointer...

file.seek(filePos);

//Now write the four (fixed-size) fields. //Note that a definition must be provided //for method writeString...

file.writeLong(acctNum);

writeString(file, surname, SURNAME_SIZE); writeString(file, initials, NUM_INITS); file.writeFloat(balance); }

public static void writeString(RandomAccessFile file, String text, int fixedSize) throws IOException { int size = text.length();

if (size<=fixedSize) { file.writeChars(text);

//Now 'pad out' the field with spaces... for (int i=size; i<fixedSize; i++) file.writeChar(' '); } else //String is too long!

file.writeChars(text.substring(0,fixedSize)); //Write to file the first fixedSize characters of //string text, starting at byte zero. }

public static void showRecords(RandomAccessFile file) throws IOException

{ long numRecords = file.length()/REC_SIZE; file.seek(0); //Go to start of file.

for (int i=0; i<numRecords; i++) { acctNum = file.readLong();

surname = readString(file, SURNAME_SIZE); //readString defined below.

initials = readString(file, NUM_INITS); balance = file.readFloat();

System.out.printf("" + acctNum + " " + surname + " " + initials + " " + "%.2f %n",balance); } } public static String readString(RandomAccessFile file, int fixedSize) throws IOException

{ String value = ""; //Set up empty string. for (int i=0; i<fixedSize; i++)

//Read character and concatenate it onto value... value+=file.readChar();

return value; }}

Tampilan pada Gambar 3 menunjukkan operasi dari program di atas.

kembali obyek asal dengan memberikan nilai komponen tersebut ke konstruktor yang sesuai.

Sebagai contoh;

ObjectOutputStream outStream = new ObjectOutputStream(new

FileOutputStream("personnel.dat")); ObjectInputStream inStream = new

ObjectInputStream(new FileInputStream("personnel.dat"));

Metode writeObjectdan readObjectdigunakan untuk masing-

masing output dan input. Kedua metode ini menulis/membaca kelas Object (superclass tertinggi), setiap obyek yang dibaca kembali dari file harus dikembalikan ke kelas asalnya sebelum digunakan lagi. Misalnya:

Personnel person = (Personnel)inStream.readObject(); //(Diasumsikan inStream dideklarasi seperti di atas.) 2.5. File I/O dengan GUI

Satu hal yang pasti terdapat dalam aplikasi GUI adalah terdapatnya sebuah kotak dialog yang membolehkan user untuk menavigasi sistem file dalam komputer dan memilih file yang akan dibuka atau target direktori untuk suatu file yang akan dibuat. Dengan menggunakan kelas JFileChooser

dari Swing,

Obyek JFileChooser membuka sebuah kotak dialog

Modal, ('Modal' berarti bahwa jendela ini harus dikeluarkan

sebelum melanjutkan ke proses berikutnya), yang

menampilkan struktur direktori sistem dan membolehkan uses

mengeksplorasinya. Ketika obyek JFileChooser dibuat,

metode setFileSelectionMode dapat digunakan untuk

menentukan di antara file dan/atau direktori yang dapat dipilih oleh user, melalui tetapan-tetapan berikut:

JFileChooser.FILES_ONLY JFileChooser.DIRECTORIES_ONLY JFileChooser.FILES_AND_DIRECTORIES

Sebagai contoh:

JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode( JFileChooser.FILES_ONLY);

Ekspresi di atas menyebabkan kotak dialog ditampilkan di tengah jendela aplikasi. Jika nulldiambil sebagai argumen, maka kotak dialog akan tampil di tengah layar. Nilai integer yang dihasilkan adalah salah satu dari tetapan berikut ini:

JFileChooser.CANCEL_OPTION JFileChooser.APPROVE_OPTION

Jika tetapan kedua yang digunakan maka metode akan menghasilkan 'true' ketika user memilih suatu file. Misalnya:

int selection = fileChooser.showOpenDialog(null); if (selection == JFileChooser.APPROVE_OPTION) ...

//(Aksi spesifik diberikan jika file dipilih.)

Jika suatu file dipilih, maka metode getSelectedFile akan menghasilkan obyek File yang bersangkutan. Misalnya:

File file = fileChooser.getSelectedFile();

Untuk I/O serial dalam string dan tipe primitif, Kita harus menyertakan obyek Scanner (untuk input) atau obyek PrintWriter (untuk output) pada obyek File, seperti yang dilakukan pada 4.1. Misalnya:

Scanner fileIn = new Scanner(file); PrintWriter fileOut = new PrintWriter(file);

Demikian juga halnya untuk I/O serial obyek, kita harus

Prosoding KNK

139

new FileOutputStream(file));

Contoh berikut ini merupakan aplikasi sederhana untuk pembacaan file nilai ujian dan menampilkan hasil setiap siswa. File yang memuat hasil adalah file serial, dimana setiap data siswa memuat tiga field: Nama belakang, Nama depan dan nilai ujian.

import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*;

public class UseFileChooser extends JFrame implements ActionListener

{ private JPanel displayPanel, buttonPanel;

private JLabel surnameLabel, firstNamesLabel, markLabel; private JTextField surnameBox, firstNamesBox, markBox; private JButton openButton, nextButton;

private Scanner input;

public static void main(String[] args) {

UseFileChooser frame = new UseFileChooser(); frame.setSize(350,150); frame.setVisible(true); } public UseFileChooser() { setTitle("FileChooser Demo"); setLayout(new BorderLayout()); displayPanel = new JPanel();

displayPanel.setLayout(new GridLayout(3,2)); surnameLabel = new JLabel("Nama Belakang"); firstNamesLabel = new JLabel("Nama Depan"); markLabel = new JLabel("Nilai");

surnameBox= new JTextField(); firstNamesBox = new JTextField(); markBox = new JTextField();

//Untuk aplikasi ini, user tidak dapat mengubah data apapun surnameBox.setEditable(false); firstNamesBox.setEditable(false); markBox.setEditable(false); displayPanel.add(surnameLabel); displayPanel.add(surnameBox); displayPanel.add(firstNamesLabel); displayPanel.add(firstNamesBox); displayPanel.add(markLabel); displayPanel.add(markBox); add(displayPanel, BorderLayout.NORTH); buttonPanel = new JPanel();

buttonPanel.setLayout(new FlowLayout()); openButton = new JButton("Open File"); openButton.addActionListener(this); nextButton = new JButton("Next Record"); nextButton.addActionListener(this); nextButton.setEnabled(false); //(Belum ada file yang terbuka.) buttonPanel.add(openButton); buttonPanel.add(nextButton);

add(buttonPanel, BorderLayout.SOUTH); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent event) {

if (input != null) //Sebuah file terbuka. input.close();

System.exit(0); } }); }

public void actionPerformed(ActionEvent event) { if (event.getSource() == openButton) { try { openFile(); } catch(IOException ioEx) { JOptionPane.showMessageDialog(this, "Unable to open file!");

} } else { try { readRecord(); } catch(EOFException eofEx) { nextButton.setEnabled(false); //(No next record.)

JOptionPane.showMessageDialog(this, "Incomplete record!\n" + "End of file reached."); }

catch(IOException ioEx) {

JOptionPane.showMessageDialog(this, "Unable to read file!");

} } }

public void openFile() throws IOException

{ if (input != null) //Suatu file telah terbuka, jadi harus //ditutup terlebih dahulu

{ input.close(); input = null; }

JFileChooser fileChooser = new JFileChooser(); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONL Y);

int selection = fileChooser.showOpenDialog(null); //Kotak dialog terbuka di tengah layar.

if (selection == JFileChooser.CANCEL_OPTION) return;

File results = fileChooser.getSelectedFile(); if (results == null||results.getName().equals("")) //Belum ada nama file yang dimasukkan oleh user. {

JOptionPane.showMessageDialog(this, "Invalid selection!");

return; }

input = new Scanner(results);

readRecord(); //Read and display first record. nextButton.setEnabled(true); //(File now open.) }

public void readRecord() throws IOException {

String surname, firstNames, textMark; //Bersihkan field teks...

surnameBox.setText(""); firstNamesBox.setText(""); markBox.setText("");

if (input.hasNext()) //Bukan akhir dari file. { surname = input.nextLine(); surnameBox.setText(surname); } else { JOptionPane.showMessageDialog(this, "End of file reached.");

nextButton.setEnabled(false);//Tidak ada data lagi. return;

}

//Mengantisipasi kemungkinan adanya data yang tidak lengkap

if (!input.hasNext()) throw (new EOFException()); //jika tidak...

firstNames = input.nextLine(); firstNamesBox.setText(firstNames);

if (!input.hasNext()) throw (new EOFException()); //jika tidak...

textMark = input.nextLine(); markBox.setText(textMark); }

Prosoding KNK

2.6. Vector

Obyek dari kelas Vector hampir sama dengan sebuah larik, tetapi ukurannya dapat bertambah atau berkurang secara dinamis bergantung pada perubahan kebutuhan penyimpanan aplikasi dan hanya memuat referensi obyek, bukan nilai dari tipe primitif.

Overloading konstruktor memungkinkan kita

menentukan ukuran awal dan, jika kita ingin, jumlah dimana ukuran Vector bertambah ketika penuh. Walaupun demikian, kita akan menggunakan jenis paling sederhana dari

konstruktor yang tidak mengambil argumen dan

mengasumsikan suatu kapasitas awal dengan nilai 10 dan menggandakannya ketika Vector penuh. Kelas dari elemen- elemen yang dimuat dalam Vector, ditentukan dalam kurung sudut setelah kata Vector (dalam deklarasi Vector dan

penciptaannya). Sebagai contoh, ekspresi berikut

mendeklarasikan dan menciptakan sebuah Vector yang memuat String:

Vector<String> stringVec = new Vector<String>(); Contoh (Asumsi bahwa Vector memuat string 3.)

stringVec.add("Example"); //Next step retrieves this element.

String word = (String)stringVec.elementAt(3);

kita dapatmerujuk elemen yang dibutuhkan dari posisinya dan

Java akan mengaturnya menjadi tipe yang kita inginkan. Misalnya:

String word1 = "Example"; stringVec.add(word1);

String word2 = stringVec.elementAt(3);

Kelas Vector terdapat dalam paket java.util, maka paket ini harus diimpor oleh program yang akan menggunakan Vector. Contoh berikut membuat tiga obyek kelas Personnel dan menggunakan metode add dari kelas Vector untuk menempatkan obyek ke dalam Vector. Metode elementAt dari kelas Vector akan digunakan untuk merujuk setiap obyek dalam Vector dan metode 'get' dari kelas Personnel untuk mengambil properti data dari ketiga obyek. Metode size dari Vector digunakan untuk menentukan jumlah elemen dalam Vector.

import java.util.*; public class VectorTest {

public static void main(String[] args) {

Vector<Personnel> staffList = new Vector<Personnel>();

Personnel[] staff =

{new Personnel(123456,"Andi", "Irmayana"), new Personnel(234567,"Kurniawan", "Teguh"), new Personnel(999999,"Pare", "Selfina")}; for (int i=0; i<staff.length; i++)

staffList.add(staff[i]);//Insert into Vector. for (Personnel person:staffList)

{ } System.out.println("\n"); } } class Personnel

//As defined in earlier example, but without //implementation of the Serializable interface. {

private long payrollNum; private String surname; private String firstNames;

public Personnel(long payNum, String sName, String fNames) { payrollNum = payNum; surname = sName; firstNames = fNames; }

public long getPayNum() {

return payrollNum; }

public String getSurname() {

return surname; }

public String getFirstNames() {

return firstNames; }

public void setSurname(String sName) { surname = sName; } } 3. PENUTUP KESIMPULAN :

1. Pemrograman Java terdiri dari instruksi-instruksi

penggunaan file yang mampu membuat program untuk membaca data dari file dan merekam data ke file.

2. File serial memiliki sejumlah kekurangan sebagai

konsekuensi dimana file tersebut hanya dapat memuat data dalam ukuran kecil atau untuk penyimpanan sementara, tetapi file tersebut lebih sederhana dan cukup sering digunakan.

3. Kita dapat membuat file teks yang memuat data

(menggunakan text editor atau wordprocessor) dan kemudian mengarahkan input dari file teks yang telah dibuat. Hal ini dapat menghemat waktu, menghindari

kejemuan, dan kencenderungan untuk salah

memasukkan data ketika menguji suatu program.

4. File akses acak dapat mengatasi kekurangan yang

terdapat pada File akses serial, Meskipun juga memeliki beberapa kekurangan akan tetapi kecepatan dan fleksibilitas dari file akses acak seringkali membuat kekurangan yang dimilikinya menjadi tidak berarti. 5. Satu hal yang penting dalam kode untuk client adalah

Prosoding KNK

141

Jan Graba. 2007. An Introduction to NetworkProgramming with Java. Faculty of ACESSheffield Hallam UniversityUK

Prosoding KNK

142

Pemanfaatan JavaBeans

pada Aplikasi Enterprise

JavaBeans