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());
마찬가지로, 당신이 할 곳 :
이
sourceFolder.resolve(file)
(예를 들어, 당신이 실행하는 경우 :
가
Paths.get(sourceFolder + "\\" + file)
가 어떻게 더 휴대용입니다 미래의 Linux 응용 프로그램에서는 "\"가 작동하지 않습니다.)
또한 맵을보다 간결하게 만들 수 있습니다 이 :
Map<String, String> env = Collections.singletonMap("create", "true");
업데이트 : 업데이트 된 코드와 아래에 코멘트에 따라이
, 내가 작업 메인 클래스는, 어디 수정하면서 가능한 한 기존 코드의 많은 재사용, 아래와 같이 만들었습니다 필요한. 기존 zip 파일에도 newFileSystem()
을 사용해야합니다. getFileSystem()
호출은 파일 시스템 제공자가 캐시 한 코드의 다른 부분에 FileSystem
오브젝트를 이미 작성한 것으로 가정하고 FileSystems.getFileSystem()
은 이미 존재하는 오브젝트에 대한 참조를 리턴합니다. 또한 FileSystem은 Closeable이므로 try-with-resources 문에서 사용하십시오. 완벽하게 작동
전체 클래스 :
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);
}
}
당신은 파일을 변경하려고 할 수 있습니다 :/D : /test.zip는 파일에 : // D : //test.zip. 그냥 2 센트 – Satya
왜 ZipEntry를 사용하지 않습니까? –
@DavidBrossard 개인 취향의 문제이지만 ZipEntry보다 Zip FileSystem을 사용하는 것이 더 쉽습니다. – DodgyCodeException