所以我需要从jar/war文件中删除一个文件.我希望有类似"jar -d myjar.jar file_I_donot_need.txt"的内容
但是现在我从Linux命令行(不使用WinRAR/Winzip或Linux等价物)看到这样做的唯一方法就是
请告诉我有一个较短的方法?
我一直在测试所有可能的变体和排列,但我似乎无法使用zip/jar方案为包含空格的路径(URI)构建FileSystemProvider.Oracle Docs提供了一个非常简单的测试用例.我冒昧地修改了这个例子,只是在URI中添加空格,它就停止工作了.下面的代码段:
import java.util.*;
import java.net.URI;
import java.nio.file.*;
public class Test {
public static void main(String [] args) throws Throwable {
Map<String, String> env = new HashMap<>();
env.put("create", "true");
URI uri = new URI("jar:file:/c:/dir%20with%20spaces/zipfstest.zip");
Path dir = Paths.get("C:\\dir with spaces");
if(Files.exists(dir) && Files.isDirectory(dir)) {
try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行此代码(Windows,JDK7u2,x32和x64)时,我得到以下异常:
java.lang.IllegalArgumentException: Illegal character in path at index 12: file:/c:/dir with spaces/zipfstest.zip
at com.sun.nio.zipfs.ZipFileSystemProvider.uriToPath(ZipFileSystemProvider.java:87)
at com.sun.nio.zipfs.ZipFileSystemProvider.newFileSystem(ZipFileSystemProvider.java:107)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:322)
at java.nio.file.FileSystems.newFileSystem(FileSystems.java:272)
Run Code Online (Sandbox Code Playgroud)
如果我使用+而不是%20作为空格转义字符,则抛出另一个异常:
java.nio.file.NoSuchFileException: c:\dir+with+spaces\zipfstest.zip
at …Run Code Online (Sandbox Code Playgroud) 可能重复:
使用Java将文件附加到zip文件
使用ZipOutputStream打开文件会覆盖它.有没有办法保留文件,只是添加新条目?
该java.nio包具有一种处理zip文件的漂亮方式,将它们视为文件系统.这使我们能够像普通文件一样处理zip文件内容.因此,只需使用Files.copy将所有文件复制到zip文件中即可实现压缩整个文件夹.由于子文件夹也要复制,我们需要一个访问者:
private static class CopyFileVisitor extends SimpleFileVisitor<Path> {
private final Path targetPath;
private Path sourcePath = null;
public CopyFileVisitor(Path targetPath) {
this.targetPath = targetPath;
}
@Override
public FileVisitResult preVisitDirectory(final Path dir,
final BasicFileAttributes attrs) throws IOException {
if (sourcePath == null) {
sourcePath = dir;
} else {
Files.createDirectories(targetPath.resolve(sourcePath
.relativize(dir).toString()));
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(final Path file,
final BasicFileAttributes attrs) throws IOException {
Files.copy(file,
targetPath.resolve(sourcePath.relativize(file).toString()), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个简单的"复制目录递归"访问者.它用于递归复制目录.但是,ZipFileSystem使用它,我们也可以使用它将目录复制到zip文件中,如下所示: …
我有很多文件要存储在一个存档文件中.我的第一种方法是将文件存储在一个gzip压缩包中.问题是,如果添加单个文件,我将重写整个存档.我可以摆脱gzip压缩,但添加文件仍然很昂贵.
您建议哪种其他存档格式允许快速追加操作?
如何将文件附加到现有的 zip 文件?我已经有了可以创建 zip 文件的代码,除了一个大问题外,它运行良好。现在的工作方式是,用户拍摄一堆照片,最后,所有照片都被添加到一个 zip 文件中,如果你拍了足够多的照片,这可能需要相当长的时间。:-( 所以我在想,我有一个非常好的和有效的解决方案。在拍摄照片时,我会在拍摄后立即将每张新照片添加到 zip 文件中。然后当他们完成拍照时,完成 zip 文件,使其可用并导出。:-)
问题是,我无法将文件添加到现有的 zip 文件中。:-( 这是我到目前为止所拥有的。另外,请记住,这只是一个概念证明,我确实理解为 for 循环的每次迭代重新初始化所有内容是非常愚蠢的。循环的每次迭代都是应该代表正在添加的另一个文件,这很可能会在很长时间之后,甚至可能是一个小时之后,这就是为什么我每次迭代都重置所有内容,因为该应用程序将在添加文件之间关闭。如果我能让这个工作,然后我实际上会放弃 for 循环并将此代码放入每次拍摄照片时都会调用的函数中。:-)
try {
for(int i=0; i < _files.size(); i++) {
//beginning of initial setup stuff
BufferedInputStream origin = null;
FileOutputStream dest = new FileOutputStream(_zipFile,false);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));
byte data[] = new byte[BUFFER];
out.setLevel(0); //I added this because it makes it not compress the data
//at all and I hoped that it would allow the zip to be appended …Run Code Online (Sandbox Code Playgroud) 如何在 java 中以务实的方式从 jar 中删除特定的文件/文件夹。
我有一个 jar ABC.jar 包含文件、文件夹和另一个 jars 说 child.jar。在 child.jar 下我想删除一个特定的文件。我能怎么做?这样我的 ABC.jar 结构保持不变。
任何帮助将不胜感激。
提前致谢。
可能重复:
使用Java将文件附加到zip文件
我有一个包含几个文件夹的zip,但重要的是dir,里面是另一个名为folder和folder的文件夹,其中包含许多我需要能够更新的文件.
我现在有一个名为dir的zip之外的目录,并且是我需要更新的文件夹,因此路径是相同的.如何将这些文件更新到zip中?
棘手的部分是dir是zip的根目录,它包含很多文件夹而不仅仅是文件夹但我只需要更新文件夹中的文件我不能弄乱文件夹外的任何文件但仍然在DIR.
可以这样做吗?我知道这可以使用-u修饰符在bash中完成,但如果可能的话,我宁愿用java来做.
感谢您对此问题的任何帮助
只是为了更清楚
在Zip / dir /文件夹/ filestoupdate里面
在zip / dir/folder/filestomoveintozip之外
可能重复:
使用Java将文件附加到zip文件
你好Java开发人员,
这是场景:
假设我有一个名为的文本文件sample.txt.我真正想要做的是将sample.txt文件放入一个*.zip名为的文件中TextFiles.zip.
这是我到目前为止所学到的.
try{
File f = new File(compProperty.getZIP_OUTPUT_PATH());
zipOut = new ZipOutputStream(new FileOutputStream(f));
ZipEntry zipEntry = new ZipEntry("sample.txt");
zipOut.putNextEntry(zipEntry);
zipOut.closeEntry();
zipOut.close();
System.out.println("Done");
} catch ( Exception e ){
// My catch block
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的代码创建了一个*.zip文件并插入了该sample.txt文件
我的问题是如何将现有文件插入到创建的*.zip文件中?
如果您的回答与TrueZIP有关,请发布SSCCE.
我做了以下事情:
我有一个.jar可以运行的可执行文件-File,但我想用另一个程序将一些文件添加到 .jar-File 中。我的想法是使用 7zip 命令行扩展,但是当我尝试向.jar-File添加一些东西时。我使用这个命令:
7za.exe a -t7z C:\myfiles\thejar.jar C:\filestoadd\* -r
每次我尝试这样做时,CMD 都会抛出一个错误并说:
Error: C:\myfiles\thejar.jar is not supported archive
好吧,好吧。然后我的想法是解压缩文件thejar.jar,将文件添加到从中thejar.jar提取文件的目录中,并创建一个.zip扩展名为.jar. 当我这样做时,文件thejar.jar比以前小了大约 1MB ,添加了文件。我尝试了不同的压缩方法,但它总是更小。当我尝试执行 时.jar,会弹出一条错误消息并说Invalid or corrupt jarfile. 我已经用谷歌搜索了我的问题,但我现在还没有得到答案......你能帮我吗?
将文件从一个 zipfile 子文件夹复制到另一个 zipfile 子文件夹。version并且folder是从前端获取的子文件夹名称。
public String restore(String jobId, String version, String folder) {
String fileName = String.valueOf(jobId) + ".zip";
String versions[] = version.replaceAll("'", "")
.replace("[", "")
.replace("]", "")
.split(",");
String folders[] = folder.replaceAll("'", "").replace("[", "").replace("]", "").split(",");
ArrayList<String> listofVersion, listofFolder = new ArrayList<>();
File destinationFile = new File(env.getProperty("file.path") + fileName);
File sourceFile = new File(env.getProperty("file.arcivePath") + fileName);
FileInputStream in;
FileOutputStream out;
ZipInputStream zin;
ZipOutputStream zipout;
int BUFFER = (int) sourceFile.length();
if (!destinationFile.exists()) {
try {
out …Run Code Online (Sandbox Code Playgroud)