ru.protek.component.xzip
Class XZipOutputStream

java.lang.Object
  extended by java.io.OutputStream
      extended by java.io.FilterOutputStream
          extended by java.util.zip.DeflaterOutputStream
              extended by ru.protek.component.xzip.XZipOutputStream
All Implemented Interfaces:
java.io.Closeable, java.io.Flushable, XZipConstants

public class XZipOutputStream
extends java.util.zip.DeflaterOutputStream
implements XZipConstants

Это моя переделка класса java.util.zip.ZipOutputStream. В стандартный класс добавлена возможность зиповать архивы, зашифрованные паролем. Алгоритм шифрации для старого зипа (версии 2). Все, что добавлено нового, находиться в конце файла (кое-какие изменения есть и в теле класса, но это не важно). Пример использования (зипуется файл "test1.xml" в архив "crypt.zip" с паролем "vlad"):

  FileOutputStream fo = new FileOutputStream("crypt.zip");
  XZipOutputStream zo = new XZipOutputStream(fo);
  zo.setPassword("vlad");
  zo.setPasswordEncode("Cp1256");
  FileInputStream fi = new FileInputStream("test1.xml");
  zo.putNextEntry(new XZipEntry("test1.xml"));
  int c;
  while ((c = fi.read()) != -1) {
      zo.write(c);
  }
  zo.close();
 


Field Summary
protected  XCRC32 crc32
          Значение хэш функции CRC32.
static int DEFLATED
          Compression method for compressed (DEFLATED) entries.
protected  byte[] randomBeginBytes
          Набор случайных чисел, которые шифруются перед шифруемым сообщением.
static int STORED
          Compression method for uncompressed (STORED) entries.
 
Fields inherited from class java.util.zip.DeflaterOutputStream
buf, def
 
Fields inherited from class java.io.FilterOutputStream
out
 
Fields inherited from interface ru.protek.component.xzip.XZipConstants
CENATT, CENATX, CENCOM, CENCRC, CENDSK, CENEXT, CENFLG, CENHDR, CENHOW, CENLEN, CENNAM, CENOFF, CENSIG, CENSIZ, CENTIM, CENVEM, CENVER, ENDCOM, ENDHDR, ENDOFF, ENDSIG, ENDSIZ, ENDSUB, ENDTOT, EXTCRC, EXTHDR, EXTLEN, EXTSIG, EXTSIZ, LOCCRC, LOCEXT, LOCFLG, LOCHDR, LOCHOW, LOCLEN, LOCNAM, LOCSIG, LOCSIZ, LOCTIM, LOCVER
 
Constructor Summary
XZipOutputStream(java.io.OutputStream out)
          Creates a new ZIP output stream.
 
Method Summary
 void close()
          Closes the ZIP output stream as well as the stream being filtered.
 void closeEntry()
          Closes the current ZIP entry and positions the stream for writing the next entry.
protected  void deflate()
          Это мой переписанный deflate(), взятый из DeflaterOutputStream.
 void finish()
          Finishes writing the contents of the ZIP output stream without closing the underlying stream.
 java.lang.String getPassword()
          Возврашает тикущей пароль.
 java.lang.String getPasswordEncode()
          Возврашает кодировку в которой установлен пароль.
(package private) static int getUTF8Length(java.lang.String s)
           
 void putNextEntry(XZipEntry e)
          Begins writing a new ZIP file entry and positions the stream to the start of the entry data.
 void setComment(java.lang.String comment)
          Sets the ZIP file comment.
 void setLevel(int level)
          Sets the compression level for subsequent entries which are DEFLATED.
 void setMethod(int method)
          Sets the default compression method for subsequent entries.
 void setPassword(java.lang.String thePassword)
          Устанавливает пароль.
 void setPasswordEncode(java.lang.String thePasswordEncode)
          Устанавливает кодировку строки пароля.
 void write(byte[] b, int off, int len)
          Writes an array of bytes to the current ZIP entry data.
 
Methods inherited from class java.util.zip.DeflaterOutputStream
write
 
Methods inherited from class java.io.FilterOutputStream
flush, write
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

STORED

public static final int STORED
Compression method for uncompressed (STORED) entries.

See Also:
Constant Field Values

DEFLATED

public static final int DEFLATED
Compression method for compressed (DEFLATED) entries.

See Also:
Constant Field Values

randomBeginBytes

protected byte[] randomBeginBytes
Набор случайных чисел, которые шифруются перед шифруемым сообщением. Необходим для предотвращения попыток вскрытия методом "plaintext attack".


crc32

protected XCRC32 crc32
Значение хэш функции CRC32. Необходима для шифрации и получения ключевой информации.

Constructor Detail

XZipOutputStream

public XZipOutputStream(java.io.OutputStream out)
Creates a new ZIP output stream.

Parameters:
out - the actual output stream
Method Detail

setComment

public void setComment(java.lang.String comment)
Sets the ZIP file comment.

Parameters:
comment - the comment string
Throws:
java.lang.IllegalArgumentException - if the length of the specified ZIP file comment is greater than 0xFFFF bytes

setMethod

public void setMethod(int method)
Sets the default compression method for subsequent entries. This default will be used whenever the compression method is not specified for an individual ZIP file entry, and is initially set to DEFLATED.

Parameters:
method - the default compression method
Throws:
java.lang.IllegalArgumentException - if the specified compression method is invalid

setLevel

public void setLevel(int level)
Sets the compression level for subsequent entries which are DEFLATED. The default setting is DEFAULT_COMPRESSION.

Parameters:
level - the compression level (0-9)
Throws:
java.lang.IllegalArgumentException - if the compression level is invalid

putNextEntry

public void putNextEntry(XZipEntry e)
                  throws java.io.IOException
Begins writing a new ZIP file entry and positions the stream to the start of the entry data. Closes the current entry if still active. The default compression method will be used if no compression method was specified for the entry, and the current time will be used if the entry has no set modification time.

Parameters:
e - the ZIP entry to be written
Throws:
java.util.zip.ZipException - if a ZIP format error has occurred
java.io.IOException - if an I/O error has occurred

closeEntry

public void closeEntry()
                throws java.io.IOException
Closes the current ZIP entry and positions the stream for writing the next entry.

Throws:
java.util.zip.ZipException - if a ZIP format error has occurred
java.io.IOException - if an I/O error has occurred

write

public void write(byte[] b,
                  int off,
                  int len)
           throws java.io.IOException
Writes an array of bytes to the current ZIP entry data. This method will block until all the bytes are written.

Overrides:
write in class java.util.zip.DeflaterOutputStream
Parameters:
b - the data to be written
off - the start offset in the data
len - the number of bytes that are written
Throws:
java.util.zip.ZipException - if a ZIP file error has occurred
java.io.IOException - if an I/O error has occurred

finish

public void finish()
            throws java.io.IOException
Finishes writing the contents of the ZIP output stream without closing the underlying stream. Use this method when applying multiple filters in succession to the same output stream.

Overrides:
finish in class java.util.zip.DeflaterOutputStream
Throws:
java.util.zip.ZipException - if a ZIP file error has occurred
java.io.IOException - if an I/O exception has occurred

close

public void close()
           throws java.io.IOException
Closes the ZIP output stream as well as the stream being filtered.

Specified by:
close in interface java.io.Closeable
Overrides:
close in class java.util.zip.DeflaterOutputStream
Throws:
java.util.zip.ZipException - if a ZIP file error has occurred
java.io.IOException - if an I/O error has occurred

getUTF8Length

static int getUTF8Length(java.lang.String s)

deflate

protected void deflate()
                throws java.io.IOException
Это мой переписанный deflate(), взятый из DeflaterOutputStream. Здесь и происходит шифрация буфера исходного сообщения, сразу после зиповки этого сообщения в этом буфере.

Overrides:
deflate in class java.util.zip.DeflaterOutputStream
Throws:
java.io.IOException - ошибка ввода-вывода.

getPassword

public java.lang.String getPassword()
Возврашает тикущей пароль.

Returns:
Пароль.

setPassword

public void setPassword(java.lang.String thePassword)
Устанавливает пароль.

Parameters:
thePassword - Пароль.

getPasswordEncode

public java.lang.String getPasswordEncode()
Возврашает кодировку в которой установлен пароль.

Returns:
кодировка строки пароля.

setPasswordEncode

public void setPasswordEncode(java.lang.String thePasswordEncode)
Устанавливает кодировку строки пароля.

Parameters:
thePasswordEncode - кодировка строки пароля.