Meng-kopi file pada Java
Mengkopi suatu file adalah operasi
biasa, dan sistem operasi manapun memiliki perintah atau cara untuk
melakukannya. Akan tetapi kita juga bisa membuat program Java untuk
melakukannya.
Karena program harus bisa mengkopi
file jenis apapun, kita tidak bisa menganggap data di dalam file adalah data
yang bisa dibaca manusia. File lagu atau video misalnya berisi deretan byte
yang merupakan representasi digital dari lagu atau video tersebut.
Oleh karena itu kita harus
menggunakan InputStream dan OutputStream untuk
melakukan operasi baca tulis yang bisa menangani data biner, bukan Reader dan Writer yang hanya bisa menangani data yang
bisa dibaca manusia.
Program yang kita buat akan mengkopi
beberapa byte sekaligus dari InputStream ke OutputStream, akan tetapi kita membutuhkan tempat sementara di mana data
tersebut akan ditempatkan sebelum data tersebut ditulis kembali pada OutputStream. Tempat sementara tersebut disebut buffer yang merupakan
array berukuran tertentu, misalnya 4096 byte (atau 4 kilo byte).
Jika sumber adalah variabel bertipe InputStream, maka byteTerbaca
= sumber.read(buffer) akan mengisi penuh buffer. Metode ini mengembalikan int
yang merupakan berapa byte yang efektif diambil oleh sumber,
kemudian diletakkan dalam variabel byteTerbaca. Jika hasilnya
-1, berarti tidak ada lagi data yang bisa diambil dari dalam sumber.
Begitu juga jika kopi
adalah keluaran yang bertipe OutputStream maka kopi.write(buffer, 0,
byteTerbaca)
menulis deretan byte dari buffer dari posisi 0 hingga byteTerbaca ke aliran keluaran kopi.
Sehingga secara umum
perintah-perintah di atas dapat dirangkum menjadi :
byte[]
buffer = new
byte[4096];
int byteTerbaca;
while((byteTerbaca
= sumber.read(buffer)) != -1)
kopi.write(buffer, 0,
byteTerbaca);
Perintah kopi-file pada sistem
operasi baik DOS/Windows atau LINUX/UNIX menggunakan perintah pada konsol yang
menambahkan file sumber dan file tujuannya. Misalnya, pada konsol Windows, kita
bisa menggunakan "copy
awal.dat akhir.dat" untuk mengkopi file awal.dat ke file bernama akhir.dat.
Tambahan parameter pada konsol ini
disebut argumen baris perintah. Argumen baris
perintah ini bisa juga digunakan dalam program Java. Dalam Java argumen baris
perintah ini diisi dalam array String[] bernama args, yang kemudian dimasukkan
sebagai parameter dalam subrutin main(). Ingat bagaimana "biasanya" subrutin main() dideklarasikan sebagai public static void main(String[] args).
Pada program Java yang sudah
dikompilasi, kita bisa memanggilnya dengan "java KopiFile awal.dat
akhir.dat"
jika KopiFile adalah nama kelas yang akan kita buat untuk mengkopi file. args[0] akan berisi awal.dat sedangkan args[1] akan
berisi akhir.dat.
Program yang akan kita buat menerima
input dari baris perintah. Kemudian program akan mengecek apakah kedua
parameter tersebut berisi nama file dengan benar. Jika salah satu parameternya
kosong, maka program akan menampilkan pesan kesalahan. Program juga akan
mengecek apakah akhir.dat merupakan file yang sudah ada sebelumnya, kemudian
memberi pertanyaan kepada user apakah isi file ini ingin ditindih dengan isi
file awal.dat.
Jika ya, maka operasi akan diteruskan, jika tidak maka program akan dihentikan.
Berikut ini adalah listing lengkap
program KopiFile, yang bisa diunduh di sini
dan diimport ke dalam Eclipse.
import java.io.*;
public class
KopiFile {
/**
* @param args
*/
public
static void
main(String[] args) {
//
Mengecek apakah argumen program cukup untuk meneruskan program
//
Dibutuhkan dua argumen, yaitu sumberFile dan tujuanFile
if
(args.length
< 2) {
System.out.println("Cara menjalankan
program : " +
"java KopiFile sumberFile tujuanFile");
return;
}
String
sumberNamaFile = args[0];
String
tujuanNamaFile = args[1];
File
sumberFile = new
File(sumberNamaFile);
File
kopiFile = new
File(tujuanNamaFile);
// Jika
kopi file sudah ada, kita akan tanyakan apakah file tujuan
// akan
ditimpa
if
(kopiFile.exists()) {
//
buat objek baru untuk mengambil input
BufferedReader
br = new
BufferedReader(new InputStreamReader(System.in));
String
timpaFile = null;
System.out.print("Apakah Anda ingin
menimpa " + tujuanNamaFile + " ? (y/t) ");
try
{
timpaFile = br.readLine();
}
catch(IOException ioe)
{
System.out.println("Kesalahan IO
terjadi");
System.exit(1);
}
// jika
jawabannya tidak, hentikan program
if
(timpaFile.equalsIgnoreCase("t"))
return;
}
// Di
sini kita siap untuk mengkopi file
// Buat
aliran input dan output
FileInputStream
sumber = null;
try
{
sumber =
new FileInputStream(sumberFile);
} catch (FileNotFoundException e)
{
System.out.println("File sumber tidak
ada, berupa direktori " +
"atau tidak bisa dibuka, program dihentikan!");
return;
}
FileOutputStream
kopi = null;
try
{
kopi =
new FileOutputStream(tujuanNamaFile);
} catch (FileNotFoundException e)
{
System.out.println("File tujuan tidak
valid atau tidak bisa ditulis, " +
"program dihentikan!");
return;
}
byte[] buffer = new byte[4096];
int
byteTerbaca;
try
{
while((byteTerbaca =
sumber.read(buffer)) != -1)
kopi.write(buffer, 0,
byteTerbaca);
} catch (IOException e) {
System.out.println("Ada masalah di
tengah pengkopian program");
return;
}
System.out.println("Kopi file selesai
dijalankan!");
}
}
Perlu diingat bahwa program ini
tidak bisa dijalankan lewat Eclipse. Jika Anda mencoba menjalankan lewat
Eclipse, maka tampilan kesalahan akan muncul, karena tidak ada parameter yang
diberikan.
Untuk menjalankan program, Anda
harus membuka konsol pada Windows dengan Start -> Run -> kemudian ketik
cmd dan enter. Setelah itu pergi ke direktori tempat proyek Anda berada pada
Eclipse. Misalnya pada komputer saya, saya meletakkan semua proyek Eclipse pada
c:\belajarjava.lyracc.com\KopiFile.
Di dalamnya seharusnya Anda akan menemui 2 direktori, yaitu src
dan bin. src adalah tempat di mana kode sumber berada, sedangkan bin
adalah tempat dimana hasil kompilasi berada. Eclipse akan melakukan kompilasi
secara otomatis.
Berikut screenshot hasil jalannya
program. Di sini saya mengkopi file dari c:\belajarjava.lyracc.com\KopiFile\src\KopiFile.java
ke c:\belajarjava.lyracc.com\Kopi123.java.
Sisipan
|