分析了下Jar格式的电子书。
首先用7-zip打开Jar文件,神奇般的发现,原来jar就是使用的zip压缩格式,解压后发现了一堆的class,png和无后缀文件。
class文件不说都知道是Java执行文件,png是图片,那么文字只可能是无后缀的文件了,用记事本打开,乱码,那么就不是ANSI了,考虑到Java的跨平台特性,测试了下UTF-8和Unicode,发现采用了Unicode格式,这样就好办了。
首先解压所有无后缀文件,然后按照文件名顺序依次以WideString方式读入,最后合并字符串即可完成。
为我写的阅读器写的jar格式插件代码如下:
library Project1;
uses
SysUtils,
Windows,
VCLUnZip,
Classes;
{$R *.res}
function GetTempDir: String;//获取系统临时目录
var
Buffer: array[0..MAX_PATH] of Char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
Result := StrPas(Buffer);
end;
function GetTempName: String;//生成一个临时文件名
var
p,f: array[0..MAX_PATH] of Char;
begin
GetTempPath(MAX_PATH, p);
randomize;
GetTempFileName(p,'~jar',random(10000),f);
result:=f;
end;
function PluginType(Ver:integer):PChar;//插件类型
begin
result:=pchar('FileOpen');
end;
function UrlPosition(Ver:integer):Pchar;//文件名位置
begin
result:=pchar('end');
end;
function UrlKeyWord(Ver:integer):Pchar;//后缀或前缀
begin
result:=pchar('.jar');
end;
functionReadExtFile(Filename:Pchar):Pchar;//读取开始
var
unzip: TVCLUnZip;
i:integer;
TS:TStringList;
WS:WideString;
TempWide:WideString;
FS:TMemoryStream;
MyFilename:string;
begin
MyFilename:=Filename;
try
unzip:=TVCLUnzip.Create(nil);
unzip.ZipName:=MyFilename;
UnZip.ReadZip;
TS:=TStringList.Create;
for I := 0 to unzip.Count - 1 do
if(pos('.',unzip.filename[i])=0)and(unzip.Filename[i]<>'')then
begin
TS.Add(unzip.Filename[i]);
UnZip.FilesList.Add(UnZip.Filename[i] );
end;
UnZip.DoAll:=false;
UnZip.DestDir:=GetTempDir;//指定目录
UnZip.RecreateDirs := True;
UnZip.RetainAttributes := True;
UnZip.UnZip;

if TS[0]='0' then
begin
DeleteFile(pchar(GetTempDir+'0'));
TS.Delete(0);
end;
WS:='';
for I := 0 to TS.Count - 1 do
begin
FS:=TMemoryStream.Create;
FS.LoadFromFile(GetTempDir+TS[i]);
DeleteFile(pchar(GetTempDir+TS[i]));
SetLength(TempWide,(Fs.Size) div 2);
Fs.Read(TempWide[1],Fs.Size);
WS:=WS+TempWide;
FS.Free;
end;
UnZip.Free;
TS.Text:=AnsiString(WS);
MyFilename:=GetTempName;
TS.SaveToFile(MyFilename);
TS.Free;
except
UnZip.Free;
Result:=PChar('');
exit;
end;
Result:=PChar(MyFilename);
end;
exports
PluginType ,UrlPosition ,UrlKeyWord ,ReadExtFile;
begin
end.