URI uri = new URI("jar:file:/D:/test.zip");
いいえ、それはjar:file:///D:/test.zip
する必要があります。しかし、それをされたことの中で最もポータブルな方法:
同様
Path dir = Paths.get("D:\\");
Path file = dir.resolve("test.zip");
URI uri = URI.create("jar:" + file.toUri());
、あなたは:
Paths.get(sourceFolder + "\\" + file)
はそれを行うのは、よりポータブルです:
sourceFolder.resolve(file)
(たとえば、あなたが実行した場合将来のLinux上のアプリケーションでは、 "\"は機能しません)。
また、マップをより簡潔にこの:
Map<String, String> env = Collections.singletonMap("create", "true");
UPDATE:あなたの更新されたコードと下のコメントに続いて
、私はどこに補正しながら、可能な限り既存のコードの多くを再利用し、以下に示す作業メインクラスを作成しました必要。既存のzipファイルに対してもnewFileSystem()
を使用する必要があることに注意してください。 getFileSystem()
呼び出しでは、ファイルシステムプロバイダによってキャッシュされたコードの別の場所にすでにFileSystem
オブジェクトが作成されており、FileSystems.getFileSystem()
は既に存在するオブジェクトへの参照を返しているものとします。また、FileSystemはCloseableであるため、try-with-resourcesステートメントで使用してください。
完全に動作する完全なクラス、:/ D:ファイルへ/test.zip:// D://test.zip
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.net.URI;
import java.nio.file.*;
import java.util.Collections;
import java.util.Map;
public class SOQn47577298 {
private final static Map<String, String> CREATE_TRUE =
Collections.singletonMap("create", "true");
interface ZipNameGenerator {
String getName();
}
static void copyFileToZip(
File sourceFolder,
FilenameFilter filenameFilter,
File destinationFolder,
ZipNameGenerator zipNameGenerator,
String fileEnding,
boolean overwriteZipWithSameName) throws IOException {
Path dir = Paths.get(destinationFolder.getAbsolutePath());
Path destination = dir.resolve(zipNameGenerator.getName() + fileEnding);
URI uri = URI.create("jar:" + destination.toUri());
final Map<String, String> env;
if (overwriteZipWithSameName || !Files.exists(destination)) {
env = CREATE_TRUE;
} else {
env = Collections.emptyMap();
}
try (FileSystem fs = FileSystems.newFileSystem(uri, env)){
for (String file : sourceFolder.list(filenameFilter)) {
Path source = sourceFolder.toPath().resolve(file);
Path dest = fs.getPath(file);
Files.copy(source, dest);
}
}
}
public static void main(String[] args) throws IOException {
final File source = new File("D:\\Ausbildungsnachweise");
final FilenameFilter nameFilter = (dir, name) -> name.endsWith(".doc");
final File dest = new File("D:\\");
final ZipNameGenerator zipNameGnr =() -> "test";
final String fileEnding = ".zip";
final boolean overwrite = false;
copyFileToZip(source, nameFilter, dest, zipNameGnr, fileEnding, overwrite);
}
}
は、ファイルを変更してみてください。ちょうど2セント – Satya
なぜあなたはZipEntryを使いませんか? –
@DavidBrossardそれは個人的な好みの問題ですが、私はZipEntryよりも使いやすいzip FileSystemを見つけました。 – DodgyCodeException