/** * Put an entry on the output stream. This writes the entry's header record and positions the * output stream for writing the contents of the entry. Once this method is called, the stream is * ready for calls to write() to write the entry's contents. Once the contents are written, * closeEntry() <B>MUST be called to ensure that all buffered data is completely written to the * output stream. * * @param entry The TarEntry to be written to the archive. */ public void putNextEntry(TarEntry entry) throws IOException { StringBuffer name = entry.getHeader().name; // NOTE // This check is not adequate, because the maximum file length that // can be placed into a POSIX (ustar) header depends on the precise // locations of the path elements (slashes) within the file's full // pathname. For this reason, writeEntryHeader() can still throw an // InvalidHeaderException if the file's full pathname will not fit // in the header. if ((entry.isUnixTarFormat() && name.length() > TarHeader.NAMELEN) || (!entry.isUnixTarFormat() && name.length() > (TarHeader.NAMELEN + TarHeader.PREFIXLEN))) { throw new InvalidHeaderException( "file name '" + name + "' is too long ( " + name.length() + " > " + (entry.isUnixTarFormat() ? TarHeader.NAMELEN : (TarHeader.NAMELEN + TarHeader.PREFIXLEN)) + " bytes )"); } entry.writeEntryHeader(this.recordBuf); this.buffer.writeRecord(this.recordBuf); this.currBytes = 0; if (entry.isDirectory()) this.currSize = 0; else this.currSize = entry.getSize(); }
/** * Closes the current tar entry * * @throws IOException */ protected void closeCurrentEntry() throws IOException { if (currentEntry != null) { if (currentEntry.getSize() > currentFileSize) { throw new IOException( "The current entry[" + currentEntry.getName() + "] of size[" + currentEntry.getSize() + "] has not been fully written."); } currentEntry = null; currentFileSize = 0; pad(); } }
/** * Returns the size of the file content (in bytes). Is only called if {@link #doGetType} returns * {@link FileType#FILE}. */ @Override protected long doGetContentSize() { if (entry == null) { return 0; } return entry.getSize(); }
/** * Checks if the bytes being written exceed the current entry size. * * @see java.io.FilterOutputStream#write(byte[], int, int) */ @Override public void write(byte[] b, int off, int len) throws IOException { if (currentEntry != null && !currentEntry.isDirectory()) { if (currentEntry.getSize() < currentFileSize + len) { throw new IOException( "The current entry[" + currentEntry.getName() + "] size[" + currentEntry.getSize() + "] is smaller than the bytes[" + (currentFileSize + len) + "] being written."); } } out.write(b, off, len); bytesWritten += len; if (currentEntry != null) { currentFileSize += len; } }