code: 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();
          }
      }
docs: 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</B> 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.