如何从jar获取文件?

时间:2011-10-18 05:43:55

标签: java jar

我需要一个文件filename.txt,它位于一个jar文件中。如何使用代码读取txt文件的内容?是否有可用于处理* .jar文件的库?

7 个答案:

答案 0 :(得分:3)

如果jar在类路径中,您可以使用getClass().getClassLoader().getResourceAsStream(...)访问其中的文件。如果jar文件不在类路径中,请查看java.util.jar.JarFile

答案 1 :(得分:3)

public class Test {
    public static void main(String[] args) {
        InputStream stream = Test.class.getResourceAsStream("/test.txt");
        Scanner s = new Scanner(stream);
        while (s.hasNext()) {
            System.out.println(s.next());
        }
    }
}

jar需要位于应用程序的类路径中。

此代码将在所有jar的根目录中搜索文件test.txt。

如果你需要指定一个不在类路径上的jar,那么其他建议可能更值得。

答案 2 :(得分:2)

  

是否有用于处理* .jar文件的库?

是的,JDK本身有java.util.zip(jar文件实际上是zip文件,more here)(不需要第三方库)。

另请参阅Oracle网站上的this article,其中提供了示例等。这是他们的第一个例子中的代码,从存档中解压缩所有文件(不是我的代码,当然像大多数例子一样,它没有足够的错误检查等):

import java.io.*;
import java.util.zip.*;

public class UnZip {
   final int BUFFER = 2048;
   public static void main (String argv[]) {
      try {
         BufferedOutputStream dest = null;
         FileInputStream fis = new FileInputStream(argv[0]);
         ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
         ZipEntry entry;
         while((entry = zis.getNextEntry()) != null) {
            System.out.println("Extracting: " +entry);
            int count;
            byte data[] = new byte[BUFFER];
            // write the files to the disk
            FileOutputStream fos = new FileOutputStream(entry.getName());
            dest = new BufferedOutputStream(fos, BUFFER);
            while ((count = zis.read(data, 0, BUFFER)) != -1) {
               dest.write(data, 0, count);
            }
            dest.flush();
            dest.close();
         }
         zis.close();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

答案 3 :(得分:1)

您不需要单独的库。默认的zip包就可以了。

private String getFile(File jar, String requestedFile) throws IOException{
    ByteArrayOutputStream out = new ByteArrayOutputStream(); //change ouptut stream as required
    ZipInputStream in = null;
    try {
        in = new ZipInputStream(new FileInputStream(jar));
        ZipEntry entry;
        while((entry  = in.getNextEntry())!=null){
            if (entry.getName().equals(requestedFile)){

                byte[] buf = new byte[1024];
                int len;
                while ((len = in.read(buf)) > 0) {
                    out.write(buf, 0, len);
                }
            }
        }
    } finally {
        if (in!=null){
            in.close();
        }
        out.close();

    }
    return new String(out.toByteArray());
}

答案 4 :(得分:1)

以下命令应该有效:

jar xf yyy.jar files/xxx.txt

确保为jar使用正确的JDK,然后使用

将其打包回来

jar uf yyy.jar files/xxx.txt

答案 5 :(得分:0)

使用任何zip实用程序软件打开它。 .jar只是一个.zip文件。

答案 6 :(得分:0)

首先检查yyy.jar位于xxx.txt的位置

jar tf yyy.jar

示例输出

META-INF/MANIFEST.MF
images/pic.gif
files/abc.txt
files/xxx.txt

现在你知道了xxx.txt的路径,

通过

提取
jar xf yyy.jar files/xxx.txt