Java 使用 Files 将文件复制到 zip
Java copy files into zip with Files
如何使用 java.nio.files.Files
将文件从 D:\test\
文件夹复制到 D:\test.zip
?我得到 NoSuchFileException: D:\Ausbildungsnachweise\Ausbildungsnachweis_Technisch_Form.doc -> D:\test.zip\Ausbildungsnachweis_Technisch_Form.doc
作为例外。我认为我使用了正确的路径,但不知道为什么会出现此错误,因为路径确实存在。
我的整个方法:
Map<String, String> env = Collections.singletonMap("create", "true");
Path dir = Paths.get(destinationFolder.getAbsolutePath());
Path destination = dir.resolve(zipNameGenerator.getName() + fileEnding);
URI uri = URI.create("jar:" + destination.toUri());
try {
FileSystem fs;
if (overwriteZipWithSameName || !Files.exists(destination)) {
fs = FileSystems.newFileSystem(uri, env);
} else {
fs = FileSystems.getFileSystem(uri);
}
for (String file : sourceFolder.list(filenameFilter)) {
Files.copy(sourceFolder.toPath().resolve(file), fs.getPath(file));
}
} catch (IOException e1) {
e1.printStackTrace();
}
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");
更新:
根据您更新的代码和您在下面的评论,我创建了一个工作主程序 class,如下所示,尽可能多地重用您现有的代码,同时在必要时进行更正。请注意,即使对于现有的 zip 文件,您也需要使用 newFileSystem()
。 getFileSystem()
调用假定您已经在代码中的其他地方创建了一个 FileSystem
对象,该对象由文件系统提供程序缓存,并且 FileSystems.getFileSystem()
returns 对已经存在的对象。此外,FileSystem 是可关闭的,因此请在 try-with-resources 语句中使用它。
完成 class,完全工作:
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);
}
}
如何使用 java.nio.files.Files
将文件从 D:\test\
文件夹复制到 D:\test.zip
?我得到 NoSuchFileException: D:\Ausbildungsnachweise\Ausbildungsnachweis_Technisch_Form.doc -> D:\test.zip\Ausbildungsnachweis_Technisch_Form.doc
作为例外。我认为我使用了正确的路径,但不知道为什么会出现此错误,因为路径确实存在。
我的整个方法:
Map<String, String> env = Collections.singletonMap("create", "true");
Path dir = Paths.get(destinationFolder.getAbsolutePath());
Path destination = dir.resolve(zipNameGenerator.getName() + fileEnding);
URI uri = URI.create("jar:" + destination.toUri());
try {
FileSystem fs;
if (overwriteZipWithSameName || !Files.exists(destination)) {
fs = FileSystems.newFileSystem(uri, env);
} else {
fs = FileSystems.getFileSystem(uri);
}
for (String file : sourceFolder.list(filenameFilter)) {
Files.copy(sourceFolder.toPath().resolve(file), fs.getPath(file));
}
} catch (IOException e1) {
e1.printStackTrace();
}
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");
更新:
根据您更新的代码和您在下面的评论,我创建了一个工作主程序 class,如下所示,尽可能多地重用您现有的代码,同时在必要时进行更正。请注意,即使对于现有的 zip 文件,您也需要使用 newFileSystem()
。 getFileSystem()
调用假定您已经在代码中的其他地方创建了一个 FileSystem
对象,该对象由文件系统提供程序缓存,并且 FileSystems.getFileSystem()
returns 对已经存在的对象。此外,FileSystem 是可关闭的,因此请在 try-with-resources 语句中使用它。
完成 class,完全工作:
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);
}
}