jar包的读取1

时间:2023-12-27 09:11:49

---恢复内容开始---

昨天在做项目插件的时候,因为会用到jar包中的一个文件来初始化程序。并且以后还是会访问这个文件,所以就想到干脆吧文件拷贝到指定目录。在拷贝的时候也费了好一会时间,这里涉及到了jar文件的操作,在这里记下来以后有用到的时候方便查找

  1. 如果jar中还存在jar包或者其他压缩包,则使用这种方式读取
    1.  public class JarFileAccess {
      
           private static final String fileSeparator = System.getProperty("file.separator");
      /**
      *
      * @param jarFileName jar文件的名称,(注意要添加“.jar”后缀,不要加任何路径分隔符)
      * @param fromDir jar的路径
      * @param toDir 要将文件拷贝到指定位置的路径
      * @throws Exception
      */
      public void accessJarFile(String jarFileName, String fromDir, String toDir) throws Exception{
      JarFile myJarFile = new JarFile(fromDir+fileSeparator+jarFileName);
      Enumeration myEnum = myJarFile.entries();
      while(myEnum.hasMoreElements()){
      JarEntry myJarEntry = (JarEntry)myEnum.nextElement();
      System.out.println(myJarEntry.getName());
      if(myJarEntry.getName().equals("config.jar")){
      InputStream is = myJarFile.getInputStream(myJarEntry);
      FileOutputStream fos = new FileOutputStream(toDir+fileSeparator+myJarEntry.getName());
      byte[] b = new byte[1024];
      int len;
      while((len = is.read(b))!= -1){
      System.out.println(b.toString());
      fos.write(b, 0, len);
      }
      fos.close();
      is.close();
      break;
      } else{
      continue;
      }
      }
      myJarFile.close();
      }
      }
  2. 如果要读取的文件在jar包中不是以压缩包或jar的形式存在,用下面的方式方便点
    1.  public class JarFileAccess{
      /**
      * @function 读取jar包中指定文件的内容并且以字符串形式返回
      * @param jarPath jar文件的路径
      * @param name 要读取的文件名称,要添加后缀名
      * @return String 返回读取到的信息
      * @throws IOException
      */
      public String readFileFromJar(String jarPath ,String name) throws IOException {
      JarFile jf = new JarFile(jarPath);
      Enumeration<JarEntry> jfs = jf.entries();
      StringBuffer sb = new StringBuffer();
      while(jfs.hasMoreElements())
      {
      JarEntry jfn = jfs.nextElement();
      if(jfn.getName().endsWith(name))
      {
      InputStream is = jf.getInputStream(jfn);
      BufferedInputStream bis = new BufferedInputStream(is);
      byte[] buf = new byte[is.available()];
      while(bis.read(buf)!=-1)
      {
      sb.append(new String(buf).trim());
      }
      bis.close();
      is.close();
      break;
      }
      }
      return sb.toString();
      }
      /**
      * @function 读取jar包中指定文件的内容并且将读取到的内容拷贝到指定文件中
      * @param jarPath jar文件的路径
      * @param name 要读取的文件名称,要添加后缀名
      * @param toNewFile 将拷贝到的信息复制到目标文件
      * @throws IOException
      */
      public void readFileFromJar(String jarPath ,String name,File toNewFile) throws IOException {
      JarFile jf = new JarFile(jarPath);
      Enumeration<JarEntry> jfs = jf.entries();
      StringBuffer sb = new StringBuffer();
      while(jfs.hasMoreElements())
      {
      JarEntry jfn = jfs.nextElement();
      if(jfn.getName().endsWith(name))
      {
      InputStream is = jf.getInputStream(jfn);
      FileOutputStream fos = new FileOutputStream(toNewFile);
      BufferedInputStream bis = new BufferedInputStream(is);
      byte[] buf = new byte[is.available()];
      while(bis.read(buf)!=-1)
      {
      fos.write(buf); }
      fos.close();
      bis.close();
      is.close();
      break;
      }
      } } }

---恢复内容结束---