ZipFileの展開をするには、java.util.zip.ZipFileを使用する。アーカイブされているファイル情報として、ディレクトリ情報もきちんと入っている場合と、そうでない場合とがあり、どちらにも対応するのは少々面倒な処理となる。少し泥臭いソースコードになったが、とりあえず、これでOpenOffice Impressのファイルを展開することができるようになった。
興味のある方は、ソースコードをどうぞ。
package
org.sssg.four.java.ziputil;
import
java.io.File;import
java.io.FileOutputStream;import
java.io.IOException;import
java.io.InputStream;import
java.util.Enumeration;import
java.util.zip.ZipEntry;import
java.util.zip.ZipFile;
public
class
Starter {
private
ZipFile zipFile;
private
int
BUFFER_SIZE = 8092
;
private
byte
[] b;
public
Starter() {
b = new
byte
[BUFFER_SIZE];
}
public
void
extract(String fileName) {
File file = new
File(fileName);
if
(!file.exists()) {
return
;
}
try
{
zipFile = new
ZipFile(file, ZipFile.OPEN_READ);
Enumeration entris = zipFile.entries();
while
(entris.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entris.nextElement();
extractFile(entry);
}
} catch
(IOException e) {
e.printStackTrace();
}
}
private
String fs = System.getProperty("file.separator"
);
public
void
extractFile(ZipEntry e) throws
IOException {
if
(e.isDirectory()) {
File dir = new
File(e.getName());
if
(!dir.exists()) {
System.err.println("Make directory 1 "
+ e.getName());
dir.mkdir();
}
return
;
}
String fileName = e.getName();
File entry = new
File(e.getName());
if
(!entry.getName().equals(fileName)) {
int
length = fileName.length() – entry.getName().length();
fileName = fileName.substring(0
, length – 1
) + fs;
File dir = new
File(fileName);
if
(!dir.exists()) {
System.err.println("Make directory 2 "
+ fileName);
dir.mkdir();
}
}
System.err.println("Extracting file "
+ entry);
FileOutputStream os = new
FileOutputStream(entry);
InputStream is = zipFile.getInputStream(e);
int
n = 0
;
while
((n = is.read(b)) > 0
) {
os.write(b, 0
, n);
}
is.close();
os.close();
}
public
static
void
main(String[] args) {
Starter u = new
Starter();
String sxi = null
;
if
(args.length == 1
) {
sxi = args[0
];
} else
{
System.out
.println("Usage: java org.sssg.four.java.ziputil.Starter <file name>"
);
return
;
}
if
(sxi.endsWith(".sxi"
)) {
u.extract(sxi);
} else
{
System.err.println(sxi + " はOpenOffice Impress ファイルではありません。"
);
}
}
}