[ 
https://issues.apache.org/jira/browse/COMPRESS-194?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

jessy updated COMPRESS-194:
---------------------------

    Comment: was deleted

(was: Stefan,

I tried to setBigNumberMode to tarOutputStream.BIGNUMBER_STAR [ =1 ]. 
However, i found that tarring completes without any exceptions, and shows the 
tar archive size as 9GB(which is my input of  9GB content file).
But ,when i tried to unzip( windows ),  I was unsuccessful in opening this tar. 
Got the error dialog "The archive is corrupt” 
When I tried to open the tar thru windows right click menu , I found my content 
 file size is 0 bytes. I have taken care to close all streams . 
Could you kindly look at my below code snippet and suggest what might be the 
rootcause for this. 


import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
import org.apache.log4j.Logger;

/**
* The Class TarArchiver.
*/
public class TarArchiver {
                
                /** The Constant TWO_KILO_BYTES. */
                private static final int TWO_KILO_BYTES = 2048;
                
                /** The tar output stream. */
                private TarArchiveOutputStream tarOutputStream;
                
                /** The file output stream. */
                private FileOutputStream fileOutputStream;
                
                /** The Constant EOF. */
                private static final int EOF = -1;
                
                /** The Constant LOGGER. */
                private static final Logger LOGGER = 
Logger.getLogger(TarArchiver.class);
                                             
                /**
                * Instantiates a new   tar archiver.
                *
                * @param directory the directory
                * @param tarName the tar name
                * @throws IOException Signals that an I/O exception has 
occurred.
                * @throws CustomException the custom exception
                */
                public void archive(String directory, String tarName) throws 
IOException, CustomException {
                                tarOutputStream = new 
TarArchiveOutputStream(new FileOutputStream(tarName));
                                
tarOutputStream.setBigNumberMode(tarOutputStream.BIGNUMBER_STAR);
                                String path = "";
                                try {
                                                archiveDir(directory, path);
                                }
                                finally {
                                                tarOutputStream.close();
                                }
                }
                
                /**
                * Archive dir.
                *
                * @param directory the directory
                * @param path the path
                * @throws CustomException the custom exception
                */
                private void archiveDir(String directory, String path) throws 
CustomException {

                                byte[] dataBuffer = new byte[TWO_KILO_BYTES];
                                fileOutputStream = null;
                                File tarDir = null;
                                try {
                                                tarDir = new File(directory);
                                                String files[] = tarDir.list();

                                                for (int count = 0; count < 
files.length; count++) {
                                                                File f = new 
File(tarDir, files[count]);
                                                                
createTarArchive(dataBuffer, path, f);
                                                }
                                                tarOutputStream.flush();
                                }
                                catch (FileNotFoundException e) {
                                                
LOGGER.error("FileNotFoundException to archive : " + tarDir, e);
                                                throw new 
CustomException(e.getMessage(), e);
                                }
                                catch (IOException e) {
                                                LOGGER.error("IOException 
during archiving : " + tarDir, e);
                                                throw new 
CustomException(e.getMessage(), e);
                                }
                }
                
                /**
                * Creates the tar archive.
                *
                * @param dataBuffer the data buffer
                * @param path the path
                * @param file the file
                * @throws IOException Signals that an I/O exception has 
occurred.
                */
                private void createTarArchive(byte[] dataBuffer, String path, 
File file) throws IOException {
                                {
                                                FileInputStream fileInputStream 
= new FileInputStream(file);
                                                try {
                                                                int bytesIn = 0;
                                                                String string = 
path + file.getName();
                                                                TarArchiveEntry 
archiveEntry = new TarArchiveEntry(file, string);
                                                                
tarOutputStream.putArchiveEntry(archiveEntry);
                                                                bytesIn = 
fileInputStream.read(dataBuffer);
                                                                while (bytesIn 
!= EOF) {
                                                                                
tarOutputStream.write(dataBuffer, 0, bytesIn);
                                                                                
bytesIn = fileInputStream.read(dataBuffer);
                                                                }
                                                                
tarOutputStream.closeArchiveEntry();
                                                }
                                                catch (RuntimeException ex) {
                                                                
closeInputStream(fileInputStream);
                                                                
closeOutputStream();
                                                }
                                                finally {
                                                                
closeInputStream(fileInputStream);
                                                }
                                }
                }


                private void closeOutputStream() {
                                closeOutputStream(fileOutputStream);
                                closeOutputStream(tarOutputStream);
                }


                private void closeOutputStream(OutputStream os) {
                                try {
                                                if (os != null) {
                                                                os.close();
                                                }
                                }
                                catch (IOException e) {
                                                LOGGER.error("Failed to close 
Output Stream.", e);
                                }
                }


                private void closeInputStream(InputStream is) {
                                try {
                                                if (is != null) {
                                                                is.close();
                                                }
                                }
                                catch (IOException e) {
                                                LOGGER.error("Failed to close 
Input Stream.", e);
                                }
                }


Jes
)
    
> Unable to create a TAR file that contains an entry which is >8 GB in size. 
> ---------------------------------------------------------------------------
>
>                 Key: COMPRESS-194
>                 URL: https://issues.apache.org/jira/browse/COMPRESS-194
>             Project: Commons Compress
>          Issue Type: Bug
>          Components: Archivers
>    Affects Versions: 1.4.1
>         Environment: I am using win xp and Red HatLinux 5.1v, but this should 
> be platform independent.
>            Reporter: jessy
>            Priority: Critical
>             Fix For: 1.4
>
>         Attachments: tarImplntion.txt
>
>
> The common-compress-1.4.1 api says it supports unlimited file sizes for tar 
> and untar operations. [http://ant.apache.org/antlibs/compress/]
> Only Untar operations on a file > 8GB is fixed,
> But creating a tar on a file >8GB is not working.
> When I try to do  " tarOutputStream.putArchiveEntry(archiveEntry); " 
> i get the below exception. 
> java.lang.RuntimeException: entry size '9633985364' is too big ( > 8589934591 
> )
>       at 
> org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.failForBigNumber(TarArchiveOutputStream.java:572)
>       at 
> org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.failForBigNumbers(TarArchiveOutputStream.java:557)
>       at 
> org.apache.commons.compress.archivers.tar.TarArchiveOutputStream.putArchiveEntry(TarArchiveOutputStream.java:297)
> Looking for a fix .. 

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to