Java 使用FileInputStream时FileNotFoundException

Java 使用FileInputStream时FileNotFoundException,java,filenotfoundexception,fileinputstream,Java,Filenotfoundexception,Fileinputstream,我正在尝试访问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());

我正在尝试访问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)
线程“main”java.io.FileNotFoundException:file:\…myFile.jar中的异常(文件名、目录名或卷标语法不正确) 在java.io.FileInputStream.open(本机方法) 位于java.io.FileInputStream。(未知源) 在intro.main(intro.java:10)
查找URL或初始化文件似乎没有问题,但我无法使FileInputStream正常工作。有人知道我做错了什么吗?非常感谢您的帮助。

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

您应该改用
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) {
    }    
}

您的方法在多个级别上都不正确:

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

    File myJar = new File(jarUrl.toString());
    
    假设
    jarUrl
    具有类型
    java.net.URL
    ,则应将其编写为:

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

    FileInputStream fis = new FileInputStream(myJar);
    
    事实上,您需要使用JAR/ZIP文件类打开它,然后使用它们打开JAR包含的文件上的流。应该是这样的:

    ZipFile zip = new ZipFile(myJar);
    ZipEntry entry = zip.getEntry(filePathInZip);
    InputStream is = entry.getInputStream();
    
    (我省略了所有必要的异常处理和代码,以关闭一些东西来防止资源泄漏。)

  • 这看起来是错误的URL:

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


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

    InputStream is =intro.class.getResourceAsStream("myFile.jar");
    
    其他的答案是,当他们说你做错了的时候,做出了一些假设。但很可疑的是,您试图先作为资源,然后作为文件访问Jar


    还有,请看这个:

    我不会拐弯抹角,我会直接切入正题。您不能以这种方式访问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();
     }
    

    @HovercraftFullOfEels(这是close语句出现在try catch中的另一个原因;)@HovercraftFullOfEels没问题,你的更正更正确,我只是懒惰;)