2

我正在尝试访问我包含在 jar 中的文件。

我的代码开头如下:

import java.io.*;
import java.net.*;

public class intro {
public static void main(String[] args) throws IOException{

    URL jarUrl = intro.class.getResource("myFile.jar");
    File myJar = new File(jarUrl.toString());

    FileInputStream fis = new FileInputStream(myjar);
}

我收到以下错误:

Exception in thread "main" java.io.FileNotFoundException: file:\...myFile.jar (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at intro.main(intro.java:10)

查找 URL 或初始化文件似乎没有问题,但我无法让 FileInputStream 工作。有人知道我做错了什么吗?帮助将不胜感激。

4

4 回答 4

3

您不能以这种方式访问​​ Jar'ed 资源。Jar 中的文件不是一个File(即文件系统文件中的文件),它们是不同的概念。

您应该URL.openStream改用。

InputStream is = null;
try {
    is = jarURL.openStream();
    // ... Read from stream
} catch (IOException exp) {
} finally {
    try {
      if (is != null) {
        is.close();
      }
    } catch (Exception exp) {
    }    
}
于 2012-09-15T03:39:08.080 回答
1

您的方法在许多层面上都不正确:

  1. 这是错误的,因为 URL 不是文件名:

    File myJar = new File(jarUrl.toString());
    

    假设jarUrl有 type java.net.URL,它应该写成:

    File myJar = new File(new URI(jarUrl));
    
  2. 这是错误的,因为它会(假设myJar是正确的)将 JAR 文件作为字节流打开:

    FileInputStream fis = new FileInputStream(myJar);
    

    实际上,您需要使用 JAR/ZIP 文件类打开它,然后使用它们打开 JAR 包含的文件上的流。它应该是这样的:

    ZipFile zip = new ZipFile(myJar);
    ZipEntry entry = zip.getEntry(filePathInZip);
    InputStream is = entry.getInputStream();
    

    (我省略了所有必要的异常处理和代码来关闭事物以防止资源泄漏。)

  3. 这看起来是一个错误的 URL:

    file:\...myFile.jar
    

    反斜杠和三个点是什么?格式正确的 URL 不会使用\.

于 2012-09-15T03:47:04.707 回答
1

如果这是已知资源,您可以使用:

InputStream is =intro.class.getResourceAsStream("myFile.jar");

当他们说你做错了时,其他答案会做出一些假设。但令人怀疑的是,您首先尝试将 Jar 作为资源,然后作为文件......

另外,请参见:getResourceAsStream() vs FileInputStream

于 2012-09-15T03:51:05.253 回答
0

我不会拐弯抹角,直接开门见山。你不能以这种方式访问​​ jar 内的文件。而是尝试以下代码。

URL jarUrl = intro.class.getResource("myFile.jar");
InputStream is = null;
String s = new String();

try {
       is = jarURL.openStream();
       Scanner scan = new Scanner(is);

       while(scan.hasNextLine){    
          s = scan.nextLine() + s;    
       }       
 } catch (IOException exp) {
 } finally {        
     is.close();
 }
于 2012-09-15T05:16:44.643 回答