Membangun Aplikasi Zip-Maker Menggunakan Java


Pernah menggunakan Winzip? Winrar? atau 7Zip? Pastinya! Apalagi jika kita menggunakan sistem operasi Windows. Kalo di linux Gnome mungkin biasa pake File Roller. Aplikasi-aplikasi tersebut digunakan untuk melakukan proses kompresi file-file menjadi sebuah file yang berupa arsip yang telah dikompresi.

Latar Belakang

Saat ini kebutuhan data sangat besar, dari mulai Hardisk sampai Flashdisk sekarang sudah semakin membesar kapasitas penyimpanannya. Dari Hardisk berkapasitas 40GB sampai 1TB, semakin hari semakin banyak produk-produk media penyimpanan yang berkapasitas semakin membesar. Kenapa? Hal ini dikarenakan kebutuhan data semakin hari, semakin besar. Saat ini, bisa dipastikan terdapat banyak sekali data yang kita miliki, dari dokumen, ebook, musik sampai video dan semakin hari, semakin bertambah banyak, tentunya semakin besar pula 😀

Salah satu solusi untuk mengecilkan ukuran file adalah dengan mengkompresi file-file tersebut. Yup! Salah satunya kita bisa menggunakan aplikasi WinZip, WinRar ataupun 7Zip. Lantas pertanyaannya bagaimanakah cara membuat aplikasi kompresi sendiri? Mudahkah membangun aplikasi kompresi di Java?

Membangun Aplikasi Zip-Maker

Saat ini, file Zip sudah bisa dibilang salah satu format file kompresi yang menjadi standar kompresi dimana pun. Hampir setiap aplikasi kompresi dapat membuat file dengan format Zip. Dan yang sangat menggembirakan adalah, format kompresi Zip ternyata sudah di support di Java. Hal ini memungkinkan kita dapat membuat aplikasi yang melibatkan kompresi format Zip menjadi lebih mudah.

Pertama saya buatkan Form untuk aplikasi yang akan kita bangun, misalkan saya membuat Form dengan tampilan dibawah ini :

Zip-Maker

Tampilan Aplikasi Zip-Maker

Sourcecode nya seperti dibawah ini (Saya sarankan menggunakan NetBeans agar lebih mudah membuat aplikasi GUI nya) :

package khannedy.blogging.zipmaker.view;

import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JTextField;
import khannedy.blogging.zipmaker.action.AddFilesAction;
import khannedy.blogging.zipmaker.action.CreateAction;
import khannedy.blogging.zipmaker.action.RemoveFilesAction;
import khannedy.blogging.zipmaker.action.SaveToAction;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class Form extends javax.swing.JFrame {

    private File fileSaveTo;
    private DefaultListModel listModel;

    /** Creates new form Form */
    public Form() {
	initComponents();

	listModel = new DefaultListModel();
	listFiles.setModel(listModel);

	buttonAddFiles.addActionListener(new AddFilesAction(this));
	buttonCreate.addActionListener(new CreateAction(this));
	buttonRemoveFiles.addActionListener(new RemoveFilesAction(this));
	buttonSaveTo.addActionListener(new SaveToAction(this));
    }

    public File getFileSaveTo() {
	return fileSaveTo;
    }

    public void setFileSaveTo(File fileSaveTo) {
	this.fileSaveTo = fileSaveTo;
	if (fileSaveTo == null) {
	    textLocation.setText("");
	} else {
	    textLocation.setText(fileSaveTo.getPath());
	}
    }

    public DefaultListModel getListModel() {
	return listModel;
    }

    public JButton getButtonAddFiles() {
	return buttonAddFiles;
    }

    public JButton getButtonCreate() {
	return buttonCreate;
    }

    public JButton getButtonRemoveFiles() {
	return buttonRemoveFiles;
    }

    public JButton getButtonSaveTo() {
	return buttonSaveTo;
    }

    public JList getListFiles() {
	return listFiles;
    }

    public JTextField getTextLocation() {
	return textLocation;
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        listFiles = new javax.swing.JList();
        textLocation = new javax.swing.JTextField();
        buttonSaveTo = new javax.swing.JButton();
        buttonAddFiles = new javax.swing.JButton();
        buttonRemoveFiles = new javax.swing.JButton();
        buttonCreate = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Zip-Maker");

        jScrollPane1.setViewportView(listFiles);

        textLocation.setEditable(false);

        buttonSaveTo.setText("Save To");

        buttonAddFiles.setText("Add Files");

        buttonRemoveFiles.setText("Remove Files");

        buttonCreate.setText("CREATE");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE)
                    .addComponent(textLocation, javax.swing.GroupLayout.DEFAULT_SIZE, 428, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(buttonCreate, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE)
                    .addComponent(buttonSaveTo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE)
                    .addComponent(buttonAddFiles, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE)
                    .addComponent(buttonRemoveFiles, javax.swing.GroupLayout.DEFAULT_SIZE, 134, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(textLocation, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(buttonSaveTo))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(buttonAddFiles)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(buttonRemoveFiles)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 218, Short.MAX_VALUE)
                        .addComponent(buttonCreate))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>
    // Variables declaration - do not modify
    private javax.swing.JButton buttonAddFiles;
    private javax.swing.JButton buttonCreate;
    private javax.swing.JButton buttonRemoveFiles;
    private javax.swing.JButton buttonSaveTo;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JList listFiles;
    private javax.swing.JTextField textLocation;
    // End of variables declaration
}

Tidak usah diketik sourcecode diatas , anda bisa download sourcecodenya di-link yang tertera di bagian akhir artikel ini :D.

Setelah itu tambah aksi tombol Save To dengan aksi yang tertera pada sourcecode dibawah ini. Aksi ini berisikan aksi untuk menyimpan lokasi file zip tempat kompresi :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JFileChooser;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class SaveToAction implements ActionListener {

    private Form form;
    private JFileChooser chooser;

    public SaveToAction(Form form) {
	this.form = form;

	chooser = new JFileChooser();
	chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
	chooser.setMultiSelectionEnabled(false);
    }

    public void actionPerformed(ActionEvent e) {
	if (chooser.showSaveDialog(form) == JFileChooser.APPROVE_OPTION) {
	    File file = chooser.getSelectedFile();
	    if (!chooser.getSelectedFile().getName().toLowerCase().endsWith(".zip")) {
		file = new File(file.getPath() + ".zip");
	    }
	    form.setFileSaveTo(file);
	}
    }
}

Tambahkan aksi untuk tombol Add Files. Aksinya berupa aksi menambah file yang akan dikompresi, seperti terlihat pada sourcecode dibawah ini :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class AddFilesAction implements ActionListener {

    private Form form;
    private JFileChooser chooser;

    public AddFilesAction(Form form) {
	this.form = form;

	chooser = new JFileChooser();
	chooser.setMultiSelectionEnabled(true);
	chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    }

    public void actionPerformed(ActionEvent e) {
	if (chooser.showOpenDialog(form) == JFileChooser.APPROVE_OPTION) {
	    File[] files = chooser.getSelectedFiles();
	    for (File file : files) {
		DefaultListModel model = form.getListModel();
		model.addElement(file);
	    }
	}
    }
}

Setelah itu tambahkan aksi tombol Remove Files, aksinya berisikan aksi menghapus file yang tertera pada list, aksi ini untuk membatalkan file-file yang akan dikompresi :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultListModel;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class RemoveFilesAction implements ActionListener {

    private Form form;

    public RemoveFilesAction(Form form) {
	this.form = form;
    }

    public void actionPerformed(ActionEvent event) {
	Object[] selecteds = form.getListFiles().getSelectedValues();
	if (selecteds.length != 0) {
	    DefaultListModel model = form.getListModel();
	    for (Object e : selecteds) {
		model.removeElement(e);
	    }
	}
    }
}

Terakhir tambahkan aksi untuk tombol Create, aksinya berukan aksi mengkompresi semua file yang telah ditambahkan (yang tertera di list) ke lokasi file yang telah dibuat pada tombol Save To :

package khannedy.blogging.zipmaker.action;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.swing.JOptionPane;
import khannedy.blogging.zipmaker.view.Form;

/**
 *
 * @author Eko Kurniawan Khannedy
 */
public class CreateAction implements ActionListener {

    private Form form;

    public CreateAction(Form form) {
	this.form = form;
    }

    public void actionPerformed(ActionEvent e) {
	if (form.getFileSaveTo() == null) {
	    showMessage("'Save File To' is Empty");
	} else if (form.getListModel().getSize() == 0) {
	    showMessage("Files is Empty");
	} else {
	    ZipOutputStream zipOutputStream = null;
	    FileOutputStream fileOutputStream = null;
	    try {
		fileOutputStream = new FileOutputStream(form.getFileSaveTo());
		zipOutputStream = new ZipOutputStream(fileOutputStream);

		byte[] buffer = new byte[1024];

		Enumeration<File> enumeration = (Enumeration<File>) form.getListModel().elements();
		while (enumeration.hasMoreElements()) {

		    File file = enumeration.nextElement();
		    FileInputStream stream = null;

		    try {

			stream = new FileInputStream(file);
			ZipEntry entry = new ZipEntry(file.getName());
			zipOutputStream.putNextEntry(entry);

			for (int i = stream.read(buffer); i != -1; i = stream.read(buffer)) {
			    zipOutputStream.write(buffer, 0, i);
			}

			zipOutputStream.closeEntry();

		    } catch (IOException exception) {
		    } finally {
			if (stream != null) {
			    stream.close();
			}
		    }
		}

	    } catch (IOException exception) {
	    } finally {
		if (zipOutputStream != null) {
		    try {
			zipOutputStream.close();
		    } catch (IOException ex) {
		    }
		}
		resetData();
	    }
	}
    }

    public void showMessage(String message) {
	JOptionPane.showMessageDialog(form, message);
    }

    private void resetData() {
	form.setFileSaveTo(null);
	form.getListModel().removeAllElements();
    }
}

Sekarang, aplikasi Zip-Maker selesai dibuat, tinggal test uji coba 😀

Referensi

Download SourceCode

http://swing-usu.googlecode.com/files/zip-maker.zip

Iklan

23 pemikiran pada “Membangun Aplikasi Zip-Maker Menggunakan Java

  1. mas, mo nanya lagee
    kmren aq dah buat aplikasi pake j2se+hibernate+spring…
    utk proses insert,dan hapus data sudah berjalan sesuai dg yg diharapkan
    namun utk proses update data masih blm bs, dan terdapat exception sebagai berikut ketika tombol ubah ditekan:

    SEVERE: could not initialize proxy – no Session
    org.hibernate.LazyInitializationException: could not initialize proxy – no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
    at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150)
    at org.mktp.entity.Provinsi$$EnhancerByCGLIB$$70ee2628.setNamaProv()
    at org.mktp.view.ProvView.btnUbahActionPerformed(ProvView.java:450)
    at org.mktp.view.ProvView.access$300(ProvView.java:17)
    at org.mktp.view.ProvView$4.actionPerformed(ProvView.java:295)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6263)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
    at java.awt.Component.processEvent(Component.java:6028)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4630)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4460)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

    sbg bahan renungan :-D, berikut adalah skrip pada tombol ubah :
    private void btnUbahActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    try {
    ApplicationContext appCtx = ApplicationContextProvider.getInstance().getApplicationContext();
    IProv dao = (IProv) appCtx.getBean(“provAdapter”, IProv.class);
    Provinsi p = dao.load(dftProv.get(tProv.getSelectedRow()).getKodeProv());
    p.setNamaProv(namaProv.getText().trim());
    p.setGubernur(gubernur.getText().trim());
    p.setWagub(wagub.getText().trim());
    dao.up(p);
    JOptionPane.showInternalMessageDialog(this, “Data berhasil diubah !”, “Informasi”, JOptionPane.INFORMATION_MESSAGE);
    this.initStatus();
    } catch (Exception e) {
    JOptionPane.showInternalMessageDialog(this, “Data gagal diubah ! karena :”+e.getMessage(), “Kesalahan”, JOptionPane.ERROR_MESSAGE);
    }
    }
    Mohon pencerahan nya . . .

  2. salam…
    saya orang malaysia.. maaf kalau lain sikit loghat/bahasa saya.. saja mau share sikit pengalaman saya…
    bila nampak entri blog ni, teringat dulu akan projek java personal saya buat dulu…
    semacam “rar to zip converter”…

    memang susah buat code kalau tiada fungsi unrar dalam java api tersendiri… lalu saya menggunakan sedikit “cheating” setelah pening mencari API utk rar(kalau ada pon, macam tak menjadi dan makin rumit)…

    oleh itu, dengan menggunakan 7-zip/rar tersedia install sebelumnya dalam OS saya… saya menggunakan
    Runtime.getRuntime().exec(//some 7zip/rar commands
    untuk unrar file rar dan zip-kannya file2 yang terextract itu semula…

    ini hanya satu idea utk berkongsi sama.. kerana saya dapati performance menggunakan ini lebih laju daripada fungsi2 java.util.zip.* …

    apa2pun saya ucapkan tahniah atas blog khannedy sbb sangat susah nak cari blog java sebegini yg ditulis oleh orang Malaysia sendiri… boleh juga saya pelajari sedikit cakap gaul orang indonesia.. hahaha

    teruskan perjuangan java anda…

  3. mas, mau tanya ttg java nih.

    Kan saya sedang buat program untuk controling mouse dengan webcam..nah, saya udah sukses untuk koneksi ke webcam. saya juga pake cara brightness tracking buat ngendaliin pointer mouseny..yg jd masalah, kan kalo webcam terbalik tampilanny..

    jd, klo kita geser k kiri, di webcam jadi ke kanan, dst..(kcuali atas bawah)..nah, cara buat reverse/invert mouse biar kanan kiriny normal?

    saya udah utak atik ga bisa2..trims atas jawabannya

  4. Ping balik: Memanfaatkan Google Docs dan Tiny URL Untuk Membuat Formulir Pendaftaran Online « Saiful Anwar blog's

  5. mas mw nanya ni…?
    gmn ya cara mengembalikan file yg dah di kompres tadi ? maksudnya logika n algoritma mana yg harus di ubah ya mas ?

    makasih sebelumnya

  6. salm kenal.. saya rudy
    Thanks banget artikelnya..
    Mo tanya ne…. klo ngerubah format .zip ke- .rar dari aplikasi gmana ya mas?
    pastinya nanti ada perbedaan hasil kompresi juga
    saya ada penelitian tentang hal itu thnks..

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s