package org.amse.ys.zip; /** * Class consists of constants, describing a compressed file. Contains only * construcor, all fields are final. */ import java.io.IOException; public class LocalFileHeader { static final int FILE_HEADER_SIGNATURE = 0x04034b50; static final int FOLDER_HEADER_SIGNATURE = 0x02014b50; static final int END_OF_CENTRAL_DIRECTORY_SIGNATURE = 0x06054b50; static final int DATA_DESCRIPTOR_SIGNATURE = 0x08074b50; int Signature; int Version; int Flags; int CompressionMethod; int ModificationTime; int ModificationDate; int CRC32; int CompressedSize; int UncompressedSize; int NameLength; int ExtraLength; public String FileName; int DataOffset; LocalFileHeader() { } void readFrom(MyBufferedInputStream stream,boolean flag) throws IOException { Signature = stream.read4Bytes(); switch (Signature) { default: break; case END_OF_CENTRAL_DIRECTORY_SIGNATURE: { stream.skip(16); int comment = stream.read2Bytes(); stream.skip(comment); break; } case FOLDER_HEADER_SIGNATURE://zip 文件 { Version = stream.read4Bytes(); Flags = stream.read2Bytes(); CompressionMethod = stream.read2Bytes(); ModificationTime = stream.read2Bytes(); ModificationDate = stream.read2Bytes(); CRC32 = stream.read4Bytes(); CompressedSize = stream.read4Bytes(); UncompressedSize = stream.read4Bytes(); if (CompressionMethod == 0 && CompressedSize != UncompressedSize) { CompressedSize = UncompressedSize; } NameLength = stream.read2Bytes(); ExtraLength = stream.read2Bytes(); int comment = stream.read2Bytes(); stream.skip(12); // FileName = stream.readString(NameLength); //hym 加,为了处理 文件名是中文的问题,导致 epub 慢的很 if(flag){ FileName = stream.readString(NameLength,true); }else{ FileName = stream.readString(NameLength); } stream.skip(ExtraLength); stream.skip(comment); break; } case FILE_HEADER_SIGNATURE://epub 文件 Version = stream.read2Bytes(); Flags = stream.read2Bytes(); CompressionMethod = stream.read2Bytes(); ModificationTime = stream.read2Bytes(); ModificationDate = stream.read2Bytes(); CRC32 = stream.read4Bytes(); CompressedSize = stream.read4Bytes(); UncompressedSize = stream.read4Bytes(); if (CompressionMethod == 0 && CompressedSize != UncompressedSize) { CompressedSize = UncompressedSize; } NameLength = stream.read2Bytes(); ExtraLength = stream.read2Bytes(); if(flag){ FileName = stream.readString(NameLength,true); }else{ FileName = stream.readString(NameLength); } // FileName = stream.readString(NameLength); // FileName = stream.readString(NameLength,true); stream.skip(ExtraLength); break; case DATA_DESCRIPTOR_SIGNATURE: CRC32 = stream.read4Bytes(); CompressedSize = stream.read4Bytes(); UncompressedSize = stream.read4Bytes(); break; } DataOffset = stream.offset(); } }