Kontrola Dekorátory CheckedInputStream resp. CheckedOutputStream usnadňují kontolu nenarušenosti InputStreamu resp. OutputStreamu pomocí kontroního součtu, jenž implementuje interfejs Checksum. Balíček java.util.zip k tomu nabízí třídy CRC32 a Adler32, které počítají vlastně jen byty a pole bytů. CRC32 crc = new CRC32( ) ; // Cyclic Redundancy Check InputStream is = new … ; CheckedInputStream cis = new CheckedInputStream( is, crc ) ; … // reading cycle long checkValue = crc.getValue( ) ; obdobně pro output PJV05
Komprese a dekomprese dat Proudy jsou konečné posloupnosti bytů či znaků jednosměrně čtených či psaných. Komprimovat lze jen proud bytů (znaky nutno vyjádřit jako byty). Deflater komprimuje ( zmenší, zahustí ) proud a Inflater dekomprimuje ( zveličí, zředí ) - do/z formátu zip, gzip anebo jar. I komprimovaný proud je jen posloupnost, která však popisuje stromovou souborovou strukturu pomocí Entry vyjadřující cestu k datům. Kompresi lze ovládat na úrovni proudu i specificky i pro každé Entry. - setMethod ( ZipOutputStream. ( DEFLATED | STORED ) ) - DEFLATED s event. užitím setLevel( 0 … 9 ) pro sílu komprese - STORED - uložení bez komprese dat – pro Entry však nutno dodat: setCrc( ) setSize( ) PJV05
java.util.zip java.util.jar Input Stream Checked InputStream Output Stream Checked OutputStream Filter InputStream Deflater InputStream Filter OutputStream Inflater OutputStream Inflater InputStream Deflater OutputStream GZIP InputStream GZIP OutputStream Zip InputStream Zip OutputStream .jar .jar Jar InputStream Jar OutputStream PJV05
java.util.zip java.util.jar java.lang Attributes Map Checksum AutoCloseable .jar java.io CRC32 Manifest Closeable Cloneable Adler32 .zip .zip ZipFile ZipEntry .jar .jar JarFile JarEntry .jar Pack200 ZipException JarException ZipError PJV05
Komprese OutputStream os = new FileOutputStream( "C:\\data.zip" ); ZipOutputStream zos = new ZipOutputStream( os ); // decorator ZipEntry ze1 = new ZipEntry( "dir1 \\ dir2 \\ YY" ); zos.putNextEntry( ze1 ); for ( int i = 0; i < 10000; i++ ) { zos.write( i ); } // 1. soubor ZipEntry ze2 = new ZipEntry( "dir1 \\ ZZ" ); zos.putNextEntry( ze2 ); for ( int i = 0; i < 10000; i++ ) { zos.write( i ); } // 2. soubor zos.close(); PJV05
Komprese Tzv. Deflater komprimuje proud do souborů typu .zip, .gzip nebo .jar. OutputStream os = new FileOutputStream( "C:\\data.zip" ); ZipOutputStream zos = new ZipOutputStream( os ); // decorator ZipEntry ze1 = new ZipEntry( "dir1 \\ dir2 \\ YY" ); zos.putNextEntry( ze1 ); for ( int i = 0; i < 10000; i++ ) { zos.write( i ); } ZipEntry ze2 = new ZipEntry( "dir1 \\ ZZ" ); zos.putNextEntry( ze2 ); zos.close(); Tzv. Inflater dekomprimuje soubory typu .zip, .gzip nebo .jar do proud. PJV05
Dekomprese InputStream is = new FileInputStream( "C:\\data.zip" ); ZipInputStream zis = new ZipInputStream( is ); // decorator ZipEntry ze; int i; while ( ( ze = zis.getNextEntry( ) ) != null ) { while ( ( i = zis.read( ) ) != -1 ) { System.out.print( i + " " ); } zis.close( ); PJV05
Dekomprese jar Ukázka jak vypsat balíčky API String fn1 = "C:/Program Files/Java/jdk1.7.0_25/jre/lib/rt.jar/" ; String fn2 = "C:/Program Files/Java/jdk1.7.0_25/src.zip" ; InputStream is = new FileInputStream( fn1 ); JarInputStream jis = new JarInputStream( is ); JarEntry je = null; while ( ( je = jis.getNextEntry( ) ) != null ) if ( je.getName( ).startsWith( "java/lang/Double" ) ) break ; int i; if ( je != null ) while ( ( i = jis.read( ) ) != -1 ) System.out.print( (char) i ); jis.close( ); PJV05
Třída ZipFile poslouží jen pro čtení komprimovaného souboru. Uložení entry a dat je patrně různé při kompresi ZipOutputStreamem Některé oblíbené programy – např. WinZip 7.0. – ukládájí data jinak než ZipOutputStream. ZipFile zf = new ZipFile ( "C:\\windata.zip" ); Enumeration en = zf.entries( ); while ( en.hasMoreElements( ) ) { System.out.print( en.nextElement( ) ; } ZipEntry ze = zf.getEntry( "dir1 / ZZ" ); InputStream is = zf.get InputStream( ze ) ; int i; while ( ( i = zis.read( ) ) != -1 ) { System.out.print( i + " " ) ; } zis.close( ) ; zf.close( ) ; PJV05 ALG