【问题标题】:FileNotFoundException when using FileInputStream使用 FileInputStream 时出现 FileNotFoundException
【发布时间】:2012-09-15 03:35:48
【问题描述】:

我正在尝试访问已包含在 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 工作。有人知道我做错了什么吗?帮助将不胜感激。

【问题讨论】:

    标签: java filenotfoundexception fileinputstream


    【解决方案1】:

    您无法以这种方式访问​​ 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) {
        }    
    }
    

    【讨论】:

    • @HovercraftFullOfEels(这是关闭语句在 try-catch 中的另一个原因;))
    • @HovercraftFullOfEels 没有问题,您的更正更正确,我只是懒惰;)
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

        假设jarUrl的类型为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 不会使用 \。

      【讨论】:

        【解决方案4】:

        我不会拐弯抹角,我会直奔主题。你不能以这种方式访问​​ 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();
         }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多