/**
   * 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();
    }
  }
예제 #3
0
  /**
   * 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;
    }
  }