Swing/ZipFile のバックアップ(No.4)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ZipFile へ行く。
- 1 (2018-07-16 (月) 23:15:45)
- 2 (2018-09-30 (日) 22:00:56)
- 3 (2019-07-29 (月) 02:31:12)
- 4 (2020-09-30 (水) 10:30:55)
- 5 (2022-06-08 (水) 17:27:35)
- category: swing
folder: ZipFile
title: JFileChooserで選択したzipファイルを展開する
tags: [JFileChooser, File]
author: aterai
pubdate: 2018-07-16T21:06:51+09:00
description: JFileChooserで選択したzipファイルを展開、またはディレクトリをzip圧縮します。
image: https://drive.google.com/uc?id=11d4t5QVL41puZ84CA-a3BBWz6zx7_4dy1A
hreflang:
href: https://java-swing-tips.blogspot.com/2018/09/expand-zip-file-selected-by-jfilechooser.html lang: en
概要
JFileChooser
で選択したzip
ファイルを展開、またはディレクトリをzip
圧縮します。
Screenshot
Advertisement
サンプルコード
JButton button1 = new JButton("unzip");
button1.addActionListener(e -> {
String str = field.getText();
Path path = Paths.get(str);
if (str.isEmpty() || Files.notExists(path)) {
return;
}
String name = Objects.toString(path.getFileName());
int lastDotPos = name.lastIndexOf('.');
if (lastDotPos > 0) {
name = name.substring(0, lastDotPos);
}
Path destDir = path.resolveSibling(name);
try {
if (Files.exists(destDir)) {
String m = String.format(
"<html>%s already exists.<br>Do you want to overwrite it?",
destDir.toString());
int rv = JOptionPane.showConfirmDialog(
button1.getRootPane(), m, "Unzip", JOptionPane.YES_NO_OPTION);
if (rv != JOptionPane.YES_OPTION) {
return;
}
} else {
if (LOGGER.isLoggable(Level.INFO)) {
LOGGER.info("mkdir0: " + destDir.toString());
}
Files.createDirectories(destDir);
}
ZipUtil.unzip(path, destDir);
} catch (IOException ex) {
ex.printStackTrace();
}
});
// ...
public static void unzip(Path zipFilePath, Path destDir) throws IOException {
try (ZipFile zipFile = new ZipFile(zipFilePath.toString())) {
Enumeration<? extends ZipEntry> e = zipFile.entries();
while (e.hasMoreElements()) {
ZipEntry zipEntry = e.nextElement();
String name = zipEntry.getName();
Path path = destDir.resolve(name);
if (name.endsWith("/")) { // if (Files.isDirectory(path)) {
log("mkdir1: " + path.toString());
Files.createDirectories(path);
} else {
Path parent = path.getParent();
if (Files.notExists(parent)) {
log("mkdir2: " + parent.toString());
Files.createDirectories(parent);
}
log("copy: " + path.toString());
Files.copy(zipFile.getInputStream(zipEntry),
path, StandardCopyOption.REPLACE_EXISTING);
}
}
}
}
View in GitHub: Java, Kotlin解説
Zip
JFileChooser#setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY)
を設定して、ディレクトリのみ表示するJFileChooser
でzip
圧縮する対象ディレクトリを選択Files.walk(...)
で対象ディレクトリ内を検索し、パスをZipEntry
に変換してZipOutputStream
に追加、Files.copy(...)
で書き出しpublic static void zip(Path srcDir, Path zip) throws IOException { try (Stream<Path> s = Files.walk(srcDir).filter(Files::isRegularFile)) { List<Path> files = s.collect(Collectors.toList()); try (ZipOutputStream zos = new ZipOutputStream(Files.newOutputStream(zip))) { for (Path f: files) { String relativePath = srcDir.relativize(f).toString(); ZipEntry ze = new ZipEntry(relativePath.replace('\\', '/')); zos.putNextEntry(ze); Files.copy(f, zos); } } } }
Unzip
JFileChooser
で展開するzip
ファイルを選択- 対象ファイルを
ZipFile
に変換して、ZipFile#entries()
で圧縮されているファイルの一覧を取得 Files.copy(zipFile.getInputStream(zipEntry), path, StandardCopyOption.REPLACE_EXISTING)
メソッドで展開StandardCopyOption.REPLACE_EXISTING
オプションで同名ファイルは上書き