Cari artikel di situs ini

File

Versi ramah cetakVersi ramah cetak

Data dan program pada memori komputer hanya bisa bertahan selama komputer itu nyala. Untuk tempat penyimpanan yang lebih lama, komputer menggunakan file, yaitu kumpulan data yang disimpan dalam hard disk, disket atau CD-ROM, USB stick, dan lain-lain. File disusun dalam direktori (atau sering juga disebut folder). Direktori bisa terdiri dari direktori lain atau file lain. Nama direktori dan file digunakan untuk mencari suatu file dalam komputer.

Program dapat membaca data dari file yang sudah ada. Program juga bisa membuat file baru atau menulis data ke dalam file yang sudah ada. Dalam Java, input dan output seperti ini bisa menggunakan aliran (stream). Data karakter yang bisa dibaca manusial dapat dibaca dari file dengan menggunakan objek dari kelas FileReader yang merupakan kelas turunan Reader. Data bisa ditulis dalam bentuk yang bisa dibaca manusia dengan menggunakan FileWriter yang merupakan kelas turunan dari Writer.

Untuk membaca atau menyimpan suatu file dalam format mesin, kelas I/O-nya adalah FileInputStream dan FileOutputStream. Semua kelas ini didefinisikan dalam paket java.io.

Perlu dicatat bahwa applet yang didownload dari suatu jaringan pada umumnya tidak bisa mengakses file karena pertimbangan keamanan. Kita bisa mendownload dan menjalankan applet, yaitu dengan mengunjungi halaman web pada browser kita. Jika applet tersebut bisa digunakan untuk mengakses file pada komputer kita, maka orang bisa membuat applet untuk menghapus semua file dalam komputer yang mendownloadnya.

Untuk mencegah hal seperti itu, ada beberapa hal di mana applet yang didownload tidak bisa lakukan. Mengakses file adalah salah satu hal yang dilarang. Akan tetapi program desktop bisa memiliki akses ke file kita seperti program-program lainnya. Program desktop bisa melakukan akses file yang dijelaskan pada bagian ini.


Kelas FileReader memiliki konstruktor yang mengambil nama file sebagai parameternya, kemudian membuat aliran input yang bisa digunakan untuk membaca file tersebut. Konstruktor ini akan melemparkan pengecualian bertipe FileNotFoundException jika file tersebut tidak ditemukan.

Jenis pengecualian seperti ini membutuhkan penanganan wajib, sehingga kita harus memanggil konstruktor di dalam pernyataan try atau menambahkan pernyataan throw di kepala subrutin yang menjalankan konstruktor tersebut. Milsanya, anggap kita memiliki file bernama "data.txt", dan kita ingin membuat program untuk membaca data pada file tersebut. Kita bisa menggunakan pernyataan berikut untuk membaca aliran input dari file tersebut :

// (Mendeklarasikan variabel sebelum pernyataan try
// jika tidak, maka variabel tersebut hanya bisa
// dilihat di dalam blok try, dan kita tidak bisa
// menggunakannya lagi di bagian program lain
FileReader data;
 
try {
    // buat aliran input
    data = new FileReader("data.txt");
}
catch (FileNotFoundException e) {
    ... // lakukan sesuatu untuk menangani kesalahan
}

Kelas FileNotFoundException merupakan kelas turunan dari IOException, sehingga kita bisa menangkap IOException pada pernyataan try...catch di atas. Secara umum, hampir semua kesalahan yang terjadi pada saat operasi input/output dapat ditangkap dengan pernyataan catch yang menangani IOException.

Begitu kita berhasil membuat FileReader, kita bisa mulai membacanya. Tapi karena FileReader hanya memiliki metode input primitif dari standar kelas Reader, kita mungkin akan perlu membungkusnya dalam objek lain, misalnya BufferedReader atau kelas pembungkus lain. Untuk membuat BufferedReader untuk membaca file bernama "data.dat", kita bisa gunakan :

TextReader data;
try {
    data = new BufferedReader(new FileReader("data.dat"));
}
    catch (FileNotFoundException e) {
    ... // tangani pengecualian
}

BufferedReader memiliki metode bantu untuk mengambil data per baris dengan perintah readline(). Sehingga apabila satu data ditulis dalam urutan per baris, kita bisa gunakan perintah Double.parseDouble(string) atau Integer.parseInt(string) untuk mengubahnya menjadi double atau int.

Untuk menyimpan data tidaklah lebih sulit dari ini. Kita bisa membuat objek bertipe FileWriter. Dan kemudian kita mungkin ingin membungkus aliran output ini dalam objek PrintWriter. Misalnya, kita ingin menyimpan data ke file yang bernama "hasil.dat", kita bisa menggunakan :

PrintWriter result;
 
try {
    keluaran = new PrintWriter(new FileWriter("hasil.dat"));
}
    catch (IOException e) {
    ... // tangani pengecualian
}

Jika tidak ada file bernama "hasil.dat", maka file baru akan dibuat. Jika file sudah ada, maka isinya akan dihapus dan diganti dengan data yang ditulis oleh program kita. Pengecualian IOException bisa terjadi jika, misalnya, file tersebut sedang dibaca oleh program lain, sehingga sistem operasi menolak program kita untuk menulisnya pada saat yang sama.

Setelah kita selesai menggunakan file, sebaiknya anda menutup file tersebut, atau mengatakan kepada sistem operasi bahwa kita telah selesai menggunakan file itu (Jika kita lupa, sistem operasi akan menutup file secara otomatis setelah program selesai dijalankan atau objek aliran file diambil oleh pemulung memori, akan tetapi akan sangat baik jika kita menutup file secara manual untuk menghindari kemungkinan lainnya).

Kita bisa menutup file dengan menggunakan metode close() pada aliran tersebut. Setelah file telah ditutup, maka kita tidak mungkin lagi membaca atau menulis data dari atau ke file tersebut. Kita harus membukanya kembali. (Perlu dicatat bahwa penutupan file juga bisa melemparkan pengecualian IOException yang wajib ditangani, akan tetapi PrintWriter menangani pengecualian tersebut secara otomatis sehingga kita tidak perlu menanganinya lagi).

Sebagai contoh komplit, berikut ini adalah program yang akan membaca angka dari file bernama "data.dat", dan kemudian menuliskannya kembali dalam urutan terbalik ke dalam file yang bernama "hasil.dat". Dalam file tersebut hanya akan ada satu angka untuk setiap barisnya dan diasumsikan tidak ada lebih dari 1000 angka sekaligus. Penanganan pengecualian digunakan untuk mengecek apakah ada masalah di tengah operasi. Meskipun mungkin tidak begitu berguna untuk aplikasi sungguhan, akan tetapi program ini mendemonstrasikan bagaimana menggunakan operasi baca tulis sederhana pada file.

package balikfile;
 
import java.io.*;
 
public class BalikFile {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        BufferedReader data;  // Aliran input karakter untuk membaca data
        PrintWriter hasil;  // Aliran output karakter untuk menulis data
 
        // Array untuk menampung semua angka dari dalam file
        double[] angka = new double[1000];  
 
        int banyakAngka;  // Banyaknya angka yg disimpan dlm array
 
        try {  // Buat aliran input
            data = new BufferedReader(new FileReader("data.dat"));
        }
        catch (FileNotFoundException e) {
            System.out.println("Tidak bisa menemukan data.dat!");
            return;  // akhiri program
        }
 
        try {  // Membuat aliran output
            hasil = new PrintWriter(new FileWriter("hasil.dat"));
        }
        catch (IOException e) {
            System.out.println("Tidak bisa membuka hasil.dat!");
            System.out.println(e.toString());
            try {
                data.close();  // Tutup file input
            }
            catch (IOException f) {
                System.out.println("Tidak bisa menutup data.dat");
            }
            return;        // End the program.
        }
 
        String baris = null; // variabel untuk menyimpan satu baris teks
 
        try {
             // Baca data dari file input
             banyakAngka = 0;
             while ((baris = data.readLine()) != null) {  // baca hingga habis
                 angka[banyakAngka] = Double.parseDouble(baris);
                 banyakAngka++;
             }
 
             // Tulis hasilnya dalam urutan terbalik
             for (int i = banyakAngka-1; i >= 0; i--)
                 hasil.println(angka[i]);
 
             System.out.println("Selesai!");
 
        }
        catch (IOException e) {
            // Ada masalah dengan pembacaan/penulisan file
            System.out.println("Kesalahan baca/tulis");
        }
        catch (NumberFormatException e) {
            // Ada masalah dengan format angka dalam file
            System.out.println("Kesalahan format: " + e.getMessage());
        }
        catch (IndexOutOfBoundsException e) {
            // Tidak boleh meletakkan 1000 angka dalam file
            System.out.println("Terlalu banyak angka.");
            System.out.println("Penulisan dihentikan.");
        }
        finally {
            // Akhiri dengan menutup semua file apapun yang terjadi
            try {
                data.close();  // Tutup file input
            }
            catch (IOException e) {
                System.out.println("Tidak bisa menutup data.dat");
            }
            hasil.close();  // Tutup file output
        }
    }
}

Berikut ini adalah program lengkapnya yang bisa diimport ke dalam Eclipse beserta contoh file data.dat.

Setelah selesai dijalankan file baru akan dibuat hasil.dat yang bisa Anda double-click untuk melihat hasilnya

 

SisipanUkuran
BalikFile-src.zip1.82 KB