alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
** Contributed by "Bay" <bayard@generationjava.com>
**
** This code has been placed into the public domain.
*/

package com.ice.tar;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import java.util.zip.GZIPOutputStream;


// we extend TarOutputStream to have the same type, 
// BUT, we don't use ANY methods. It's all about 
// typing.

/**
 * Outputs tar.gz files. Added functionality that it 
 * doesn't need to know the size of an entry. If an 
 * entry has zero size when it is put in the Tar, then 
 * it buffers it until it's closed and it knows the size.
 *
 * @author "Bay" <bayard@generationjava.com>
 */

public
class		TarGzOutputStream
extends		TarOutputStream
	{
    private TarOutputStream			tos = null;
    private GZIPOutputStream		gzip = null;
    private ByteArrayOutputStream	bos = null;
    private TarEntry				currentEntry = null;

	public
	TarGzOutputStream( OutputStream out )
		throws IOException
		{
		super( null );
		this.gzip = new GZIPOutputStream( out );
		this.tos = new TarOutputStream( this.gzip );
		this.bos = new ByteArrayOutputStream();
		}

	// proxy all methods, but buffer if unknown size

	public void
	setDebug( boolean b )
		{
		this.tos.setDebug(b);
		}

	public void
	setBufferDebug( boolean b )
		{
		this.tos.setBufferDebug(b);
		}

	public void
	finish()
		throws IOException
		{
		if ( this.currentEntry != null )
			{
			closeEntry();
			}

		this.tos.finish();
		}

	public void
	close()
		throws IOException
		{
		this.tos.close();
		this.gzip.finish();
		}

	public int
	getRecordSize()
		{
		return this.tos.getRecordSize();
		}

	public void
	putNextEntry(TarEntry entry)
		throws IOException
		{
		if ( entry.getSize() != 0 )
			{
			this.tos.putNextEntry( entry );
			}
		else
			{
			this.currentEntry = entry;
			}
		}

	public void
	closeEntry()
		throws IOException
		{
		if(this.currentEntry == null)
			{
			this.tos.closeEntry();
			}
		else
			{
			this.currentEntry.setSize( bos.size() );
			this.tos.putNextEntry( this.currentEntry );
			this.bos.writeTo( this.tos );
			this.tos.closeEntry();
			this.currentEntry = null;
			this.bos = new ByteArrayOutputStream();
			}
		}

	public void
	write( int b )
		throws IOException
		{
		if ( this.currentEntry == null )
			{
			this.tos.write( b );
			}
		else
			{
			this.bos.write( b );
			}
		}

	public void
	write( byte[] b )
		throws IOException
		{
		if ( this.currentEntry == null )
			{
			this.tos.write( b );
			}
		else
			{
			this.bos.write( b );
			}
		}

	public void
	write( byte[] b, int start, int length )
		throws IOException
		{
		if ( this.currentEntry == null )
			{
			this.tos.write( b, start, length );
			}
		else
			{
			this.bos.write( b, start, length );
			}
		}

	}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.