Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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-以编程方式将文件附加到Jar文件_Java_File_Jar - Fatal编程技术网

Java-以编程方式将文件附加到Jar文件

Java-以编程方式将文件附加到Jar文件,java,file,jar,Java,File,Jar,我到处寻找一种方法来解决这个问题,找到了各种不同的方法来解决这个问题,但没有一种方法对我有效 我只需要一种将文件附加到Jar文件的方法,如果它们已经存在,则覆盖它们,我也希望使用最快的方法来实现这一点。我曾尝试将其转换为Zip文件并使用Zip文件系统添加文件,但我遇到了诸如“Zip END header not found”之类的错误,其他方法也可以工作,但速度非常慢(6MB的文件需要3分钟) 将文件附加到Jar文件的最快方法是什么 编辑:是的,继续,向下投票,而不是回答,非常有效率。你可以用更

我到处寻找一种方法来解决这个问题,找到了各种不同的方法来解决这个问题,但没有一种方法对我有效

我只需要一种将文件附加到Jar文件的方法,如果它们已经存在,则覆盖它们,我也希望使用最快的方法来实现这一点。我曾尝试将其转换为Zip文件并使用Zip文件系统添加文件,但我遇到了诸如“Zip END header not found”之类的错误,其他方法也可以工作,但速度非常慢(6MB的文件需要3分钟)

将文件附加到Jar文件的最快方法是什么


编辑:是的,继续,向下投票,而不是回答,非常有效率。

你可以用更新文本文件的同样方法来进行此操作:

  • 从当前文件打开输入流
  • 打开新(临时)文件的输出流
  • 从输入流读取:
    • 如果不需要更改,则写入输出流
    • 如果内容应该删除,不要写它
    • 如果内容需要更改,请先更改,然后再编写
    • 如果此时需要添加新内容,请立即编写
    • 重复此操作,直到处理完所有内容
  • 关闭两条溪流
  • 删除/重命名旧文件并将新文件重命名为旧文件

就你而言,这意味着:

  • 从要添加的文件列表开始
  • 打开当前Jar文件
  • 打开新的(临时)Jar文件
  • 复制所有现有条目(文件),将被替换的文件除外
  • 插入所有新文件
  • 关闭两条溪流
  • 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件
你当然可以改变顺序

  • 打开新的(临时)Jar文件
  • 插入所有新文件,并记住它们的名称
  • 打开当前Jar文件
  • 复制所有现有条目(文件),但已添加的文件除外
  • 关闭两条溪流
  • 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件

更新文本文件的方法与此相同:

  • 从当前文件打开输入流
  • 打开新(临时)文件的输出流
  • 从输入流读取:
    • 如果不需要更改,则写入输出流
    • 如果内容应该删除,不要写它
    • 如果内容需要更改,请先更改,然后再编写
    • 如果此时需要添加新内容,请立即编写
    • 重复此操作,直到处理完所有内容
  • 关闭两条溪流
  • 删除/重命名旧文件并将新文件重命名为旧文件

就你而言,这意味着:

  • 从要添加的文件列表开始
  • 打开当前Jar文件
  • 打开新的(临时)Jar文件
  • 复制所有现有条目(文件),将被替换的文件除外
  • 插入所有新文件
  • 关闭两条溪流
  • 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件
你当然可以改变顺序

  • 打开新的(临时)Jar文件
  • 插入所有新文件,并记住它们的名称
  • 打开当前Jar文件
  • 复制所有现有条目(文件),但已添加的文件除外
  • 关闭两条溪流
  • 删除/重命名旧Jar文件,并将新文件重命名为旧Jar文件

    • 以下是我能找到的最好方法:

      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.ArrayList;
      import java.util.Arrays;
      import java.util.Enumeration;
      import java.util.List;
      import java.util.jar.JarEntry;
      import java.util.jar.JarFile;
      import java.util.jar.JarOutputStream;
      
      public class JarUtil {
      
          public static void updateJarFile(File srcJarFile, boolean update, File ...filesToAdd) throws IOException {
      
              File tmpJarFile = File.createTempFile("tempJar", ".tmp");
              JarFile jarFile = new JarFile(srcJarFile);
              boolean jarUpdated = false;
              List<String> fileNames = new ArrayList<String>();
      
              try {
                  JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(tmpJarFile));
                  try {
                      // Added the new files to the jar.
                      for (int i = 0; i < filesToAdd.length; i++) {
                          File file = filesToAdd[i];
                          FileInputStream fis = new FileInputStream(file);
                          try {
                              byte[] buffer = new byte[1024];
                              int bytesRead = 0;
                              JarEntry entry = new JarEntry(file.getName());
                              fileNames.add(entry.getName());
                              tempJarOutputStream.putNextEntry(entry);
                              while ((bytesRead = fis.read(buffer)) != -1) {
                                  tempJarOutputStream.write(buffer, 0, bytesRead);
                              }
      
                              // System.out.println(entry.getName() + " added.");
                          } finally {
                              fis.close();
                          }
                      }
      
                      // Copy original jar file to the temporary one.
                      Enumeration<?> jarEntries = jarFile.entries();
                      while (jarEntries.hasMoreElements()) {
                          JarEntry entry = (JarEntry) jarEntries.nextElement();
                          /*
                           * Ignore classes from the original jar which are being
                           * replaced
                           */
                          String[] fileNameArray = (String[]) fileNames
                                  .toArray(new String[0]);
                          Arrays.sort(fileNameArray);// required for binary search
                          if (Arrays.binarySearch(fileNameArray, entry.getName()) < 0) {
                              InputStream entryInputStream = jarFile
                                      .getInputStream(entry);
                              tempJarOutputStream.putNextEntry(entry);
                              byte[] buffer = new byte[1024];
                              int bytesRead = 0;
                              while ((bytesRead = entryInputStream.read(buffer)) != -1) {
                                  tempJarOutputStream.write(buffer, 0, bytesRead);
                              }
                          } else if (!update) {
                              throw new IOException(
                                      "Jar Update Aborted: Entry "
                                              + entry.getName()
                                              + " could not be added to the jar"
                                              + " file because it already exists and the update parameter was false");
                          }
                      }
      
                      jarUpdated = true;
                  } catch (Exception ex) {
                      System.err.println("Unable to update jar file");
                      tempJarOutputStream.putNextEntry(new JarEntry("stub"));
                  } finally {
                      tempJarOutputStream.close();
                  }
      
              } finally {
                  jarFile.close();
                  // System.out.println(srcJarFile.getAbsolutePath() + " closed.");
      
                  if (!jarUpdated) {
                      tmpJarFile.delete();
                  }
              }
      
              if (jarUpdated) {
                  srcJarFile.delete();
                  tmpJarFile.renameTo(srcJarFile);
                  // System.out.println(srcJarFile.getAbsolutePath() + " updated.");
              }
          }
      }
      
      导入java.io.File;
      导入java.io.FileInputStream;
      导入java.io.FileOutputStream;
      导入java.io.IOException;
      导入java.io.InputStream;
      导入java.util.ArrayList;
      导入java.util.array;
      导入java.util.Enumeration;
      导入java.util.List;
      导入java.util.jar.JarEntry;
      导入java.util.jar.jar文件;
      导入java.util.jar.JarOutputStream;
      公共类JarUtil{
      公共静态void updateJarFile(文件srcJarFile、布尔更新、文件…filesToAdd)引发IOException{
      File tmpJarFile=File.createTempFile(“tempJar”,“.tmp”);
      JarFile JarFile=新的JarFile(srcJarFile);
      布尔值=false;
      列表文件名=新的ArrayList();
      试一试{
      JarOutputStream tempJarOutputStream=newjaroutputstream(newfileoutputstream(tmpJarFile));
      试一试{
      //将新文件添加到jar中。
      for(int i=0;i