Skip navigation

Monthly Archives: July 2008

When we develop an application, sometimes we need to read a file from disk. Not only character based files, but also byte/binary based files. To read/write character based files we use Writer and Reader class hierarchy, to read byte/binary based files we use InputSteam and OutputStream class hierarchy.

This article will show how to read binary files such as EXE, PDF, and make a copy of that file on different location on disk. We will open the file, read byte by byte, and write all the bytes we get to make a copy of that file.

I use three different way to get the bytes from the file as far as i know. I dont know which one is the best based on the performance or algorithm :p.

(Way 1)


File file = new File(PATH_TO_FILES);

fis = new FileInputStream(file);
dis = new DataInputStream(new BufferedInputStream(fis));

fos = new FileOutputStream(DESTINATION_PATH_AND_FILE_NAME);
dos = new DataOutputStream(new BufferedOutputStream(fos));

byte b;
try{
	while(true){
		b = (byte) dis.readByte();

		dos.write(b);
	}
}
catch(EOFException e){
	System.err.println("Finish read end of file...");
}
finally{
        dos.close();
}

(Way 2)

File file = new File(PATH_TO_FILES);

fis = new FileInputStream(file);
dis = new DataInputStream(new BufferedInputStream(fis));

fos = new FileOutputStream(DESTINATION_PATH_AND_FILE_NAME);
dos = new DataOutputStream(new BufferedOutputStream(fos));

byte[] b = new byte[(int) file.length()];

for(int i=0; i<b.length-1; i++)
{
	b&#91;i&#93; = dis.readByte();
}

dos.write(b);
dos.close();
&#91;/sourcecode&#93;</pre>

<strong>(Way 3)</strong>
<pre>
File file = new File(PATH_TO_FILES);

fis = new FileInputStream(file);
dis = new DataInputStream(new BufferedInputStream(fis));

fos = new FileOutputStream(DESTINATION_PATH_AND_FILE_NAME);
dos = new DataOutputStream(new BufferedOutputStream(fos));

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[200];

while(true){
	int length = dis.read(b);

	System.out.println("read : " + length);

	if (length < 0) {
		break;
	}

	if(length > 0){
		baos.write(b, 0, length);
	}

}

dos.write(baos.toByteArray());
dos.close();

(Full source code)

/**
 * @author	: gardiary
 * @Waktu	: Jul 28, 2008, 4:33:14 PM
 *
 * StreamSample.java
 */
package test.filehandling;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class StreamSample {
	private File file;
	private FileInputStream fis;
	private FileOutputStream fos;
	
	private DataInputStream dis;
	private DataOutputStream dos;
	
	public StreamSample()
	{
		file = new File("input/ajax-tutorial.pdf");		
	}
	
	public static void main(String args[])
	{
		StreamSample app = new StreamSample();
		
		app.copyFile1();
		System.out.println("Done copy file 1...");
		
		app.copyFile2();
		System.out.println("Done copy file 2...");
		
		app.copyFile3();
		System.out.println("Done copy file 3...");
		
		try{
			app.dis.close();
			app.fis.close();
		}
		catch(IOException ioe){
			ioe.printStackTrace();
		}
	}
	
	// copy file first way
	public void copyFile1()
	{
		openFileInput();
		
		try{
			fos = new FileOutputStream("output/copy-of-ajax-tutorial-1.pdf");
			dos = new DataOutputStream(new BufferedOutputStream(fos));
			
			byte b;
			try{
				while(true){
					b = dis.readByte();
					
					dos.write(b);
				}
				
			}
			catch(EOFException e){
				System.err.println("Finish read end of file...");
			}
			
		}
		catch(IOException e){
			System.err.println("IOException...1");
		}
		finally{
			closeOutputStream(dos);
			closeOutputStream(fos);
		}
	}
	
	// copy file second way
	public void copyFile2()
	{
		openFileInput();
		
		try{
			fos = new FileOutputStream("output/copy-of-ajax-tutorial-2.pdf");
			dos = new DataOutputStream(new BufferedOutputStream(fos));
			
			byte[] b = new byte[(int) file.length()];
			
			for(int i=0; i<b.length-1; i++)
			{
				b&#91;i&#93; = dis.readByte();
			}
			
			dos.write(b);
		}
		catch(IOException e){
			System.err.println("IOException...2");
			e.printStackTrace();
		}
		finally{
			closeOutputStream(dos);
			closeOutputStream(fos);
		}
	}
	
	// copy file third way
	public void copyFile3()
	{
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte&#91;&#93; b = new byte&#91;200&#93;;
	
		openFileInput();
		
		try{
			fos = new FileOutputStream("output/copy-of-ajax-tutorial-3.pdf");
			dos = new DataOutputStream(new BufferedOutputStream(fos));
			
			while(true){
				int length = dis.read(b);
				
				System.out.println("read : " + length);
				
				if (length < 0) {
			        break;
				}
				
				if(length > 0){
					baos.write(b, 0, length);
				}
								
			}
			
			dos.write(baos.toByteArray());
		}
		catch(IOException e){
			System.err.println("IOException...3");
		}
		finally{
			closeOutputStream(dos);
			closeOutputStream(fos);
		}
	}
	
	// open file for input
	public void openFileInput()
	{
		try{
			fis = new FileInputStream(file);
			dis = new DataInputStream(new BufferedInputStream(fis));
		}
		catch(FileNotFoundException e){
			System.err.println("File Not Found...!");
		}
	}
	
	// close output stream
	public void closeOutputStream(OutputStream os)
	{
		try{
			os.close();
		}
		catch(IOException ioe){
			System.err.println("Exception closing output stream");
		}
		
	}
}
Advertisements

I think people must to consider on using Hibernate as their database layer. You will learn knowledge about object oriented paradigm using Hibernate. How every entity in database act as an object that related each other.

This code or this show the most basic CRUD using Hibernate, not using complex relationship, only one entity. For GUI I use my favorite SWT framework. Download and change the extension to .zip. Then extract it and open using Eclipse.

Before run the application edit hibernate.cfg.xml to match your environment.

(screenshot)