Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我创建的ZIP文件没有';你不在游戏中工作吗?_Java_Windows_File_Zip_Corrupt - Fatal编程技术网

Java 为什么我创建的ZIP文件没有';你不在游戏中工作吗?

Java 为什么我创建的ZIP文件没有';你不在游戏中工作吗?,java,windows,file,zip,corrupt,Java,Windows,File,Zip,Corrupt,我最近决定为我的项目编写一个启动程序。它只是从我的服务器下载更新后的文件,解压它们,合并一些文件(因为它们的内容随启动器的设置而变化),然后将它们打包成一个.zip文件 我确信下载和合并过程可以完美地工作,但最后一个过程——压缩——不行 以下是我的压缩代码: --这就是我不工作的代码所在-- zip文件创建正确,但当我将其放入游戏目录时,游戏将无法启动(表示它已损坏)。但是如果我用WinRar打开它(是的,它打开时没有错误——“测试”功能也没有显示错误),然后在里面添加一个随机文件,游戏就开始了

我最近决定为我的项目编写一个启动程序。它只是从我的服务器下载更新后的文件,解压它们,合并一些文件(因为它们的内容随启动器的设置而变化),然后将它们打包成一个.zip文件

我确信下载和合并过程可以完美地工作,但最后一个过程——压缩——不行

以下是我的压缩代码:

--这就是我不工作的代码所在--

zip文件创建正确,但当我将其放入游戏目录时,游戏将无法启动(表示它已损坏)。但是如果我用WinRar打开它(是的,它打开时没有错误——“测试”功能也没有显示错误),然后在里面添加一个随机文件,游戏就开始了

看起来WinRar以正确的方式重新创建了zip文件,但我不能让我的启动器这样做

有什么想法吗

编辑1:

我发现了另一段应该可以工作的代码:



      private static void zipDir(String zipFileName, String dir) throws Exception {
            File dirObj = new File(dir);
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
            System.out.println("Creating : " + zipFileName);
            addDir(dirObj, out);
            out.close();
          }

          static void addDir(File dirObj, ZipOutputStream out) throws IOException {
            File[] files = dirObj.listFiles();
            byte[] tmpBuf = new byte[1024];

            for (int i = 0; i < files.length; i++) {
              if (files[i].isDirectory()) {
                addDir(files[i], out);
                continue;
              }
              String fap = files[i].getAbsolutePath();
              String rel_path = fap.substring(fap.indexOf("wypakowane") + 11).replace("\\", "/");
              FileInputStream in = new FileInputStream(fap);
              System.out.println(" Adding: " + rel_path);
              out.putNextEntry(new ZipEntry(rel_path));
              int len;
              while ((len = in.read(tmpBuf)) > 0) {
                out.write(tmpBuf, 0, len);
              }
              out.closeEntry();
              in.close();
            }
          }


私有静态void zipDir(字符串zipFileName,字符串dir)引发异常{
File dirObj=新文件(dir);
ZipOutputStream out=newzipoutpstream(newfileoutputstream(zipFileName));
System.out.println(“创建:+zipFileName”);
addDir(dirObj,out);
out.close();
}
静态void addDir(文件dirObj,ZipOutputStream out)引发IOException{
File[]files=dirObj.listFiles();
字节[]tmpBuf=新字节[1024];
对于(int i=0;i0){
out.write(tmpBuf,0,len);
}
out.closeEntry();
in.close();
}
}
我认为它会在ZIP文件中创建目录。不幸的是,游戏还没有开始。。。 (“wypakowane”是包含我要放入ZIP文件的所有文件的目录。)

编辑2:


我只是比较了两个归档文件——一个是我的java应用程序创建的,另一个是WinRar通过添加随机文件创建的。它们是相同的,具有相同的CRC,相同的属性,并且正确解包。但是第一个游戏崩溃了,第二个游戏运行得很顺利。我的点子快用完了。有什么帮助吗?

您似乎没有为目录本身创建条目,只是为文件创建条目。虽然可以从文件路径重建目录条目,但如果不放入显式条目,许多软件将无法正确处理该文件


目录条目只是路径以“/”结尾的常规条目?将winrar与你的应用捆绑在一起,让它在你开始游戏时添加一个垃圾文件?:-)Java是否正在以Zip64格式保存它?我如何检查它?如果是呢?我已经修改了我的代码(第二个)。当我打印出zip的内容时,结构是正确的。现在怎么了?