【问题标题】:How to read file from relative path in Java project? java.io.File cannot find the path specified如何从Java项目中的相对路径读取文件? java.io.File 找不到指定的路径
【发布时间】:2011-04-20 03:32:54
【问题描述】:

我有一个包含 2 个包的项目:

  1. tkorg.idrs.core.searchengines
  2. tkorg.idrs.core.searchengines

在包 (2) 我有一个文本文件 ListStopWords.txt,在包 (1) 我有一个类 FileLoadder。这是FileLoader中的代码:

File file = new File("properties\\files\\ListStopWords.txt");

但是有这个错误:

The system cannot find the path specified

你能给出解决方案吗?谢谢。

【问题讨论】:

  • 您的两个包示例是相同的。你不是说properties.files 代表2 吗?

标签: java file


【解决方案1】:

试试.\properties\files\ListStopWords.txt

【讨论】:

    【解决方案2】:

    如果它已经在类路径中,那么只需从类路径而不是从磁盘文件系统中获取它。不要摆弄java.io.File 中的相对路径。它们依赖于您完全无法从 Java 代码内部控制的当前工作目录。

    假设 ListStopWords.txt 与您的 FileLoader 类在同一个包中,然后执行:

    URL url = getClass().getResource("ListStopWords.txt");
    File file = new File(url.getPath());
    

    或者,如果你最终追求的只是InputStream

    InputStream input = getClass().getResourceAsStream("ListStopWords.txt");
    

    这当然比创建new File() 更可取,因为url 可能不一定代表磁盘文件系统路径,但它也可能代表虚拟文件系统路径(当 JAR 扩展到内存而不是到磁盘文件系统上的临时文件夹中)甚至是网络路径,它们都不是File构造函数可消化的定义。

    如果文件 - 如包名提示 - 实际上 是一个完整的 properties file(包含 key=value 行),只是“错误”扩展名,那么您可以提供 @987654333 @ 立即到load() 方法。

    Properties properties = new Properties();
    properties.load(getClass().getResourceAsStream("ListStopWords.txt"));
    

    注意:当您尝试从static 上下文中访问它时,请在上面的示例中使用FileLoader.class(或任何YourClass.class)而不是getClass()

    【讨论】:

    • FileLoader 是否已从 java 中删除?我试图从静态上下文(java 6)中执行此操作,但找不到任何导入它的方法,它一直告诉我它无法解析为类型。奇怪的是,它在我输入时自动完成,但随后又给我一个错误。
    • 哦,应该是ClassLoader.class。
    • @turbo: FileLoader 是 OP 自己的自定义类。它应该正是您尝试获取资源的那个类。因此,NameOfYourCurrentClass.class.getResourceAsStream(...)。如果 ClassLoader 类正在由不同的类加载器加载,ClassLoader.class 将失败,这可能发生在具有多个类加载器层次结构的“企业”应用程序(如 Java EE Web 应用程序)中。
    • 哦,我明白了。我不明白它是依赖的。感谢您清除它!
    • 如果文件不在同一个包中,有什么建议吗?在我的例子中,我试图打开一个位于测试包中的文件。
    【解决方案3】:
    InputStream in = FileLoader.class.getResourceAsStream("<relative path from this class to the file to be read>");
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line = null;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    【讨论】:

    • @IgorGanapolsky 是类的名称。您只能通过提供其类的全名来引用 .class 文字。
    • 我认为它打算成为 FileLoader。
    【解决方案4】:

    如果我们想指定文件的相对路径,可以使用以下行。

    File file = new File("./properties/files/ListStopWords.txt");  
    

    【讨论】:

    • 我可以知道为什么路径之间有 3 个斜线。
    • 错误:> 字符串文字中有非法的转义字符。
    • 如何将其转换为InputStream
    • @IgorGanapolsky InputStream is = new FileInputStream("./properties/files/ListStopWords.txt");
    【解决方案5】:

    如果您尝试从静态方法或静态块调用getClass(),您可以执行以下方式。

    您可以在要加载到的Properties 对象上调用getClass()

    public static Properties pathProperties = null;
    
    static { 
        pathProperties = new Properties();
        String pathPropertiesFile = "/file.xml;
        InputStream paths = pathProperties.getClass().getResourceAsStream(pathPropertiesFile);
    }
    

    【讨论】:

    • 只是缺少一个结束引号。
    【解决方案6】:

    虽然 BalusC 提供的答案适用于这种情况,但当文件路径包含空格时它会中断,因为在 URL 中,这些被转换为不是有效文件名的 %20。如果您使用 URI 而不是 String 构造 File 对象,则会正确处理空格:

    URL url = getClass().getResource("ListStopWords.txt");
    File file = new File(url.toURI());
    

    【讨论】:

      【解决方案7】:

      相对路径在 Java 中使用 . 说明符。

      • . 表示与当前运行的上下文相同的文件夹。
      • .. 表示当前运行上下文的父文件夹。

      所以问题是你如何知道 Java 当前正在寻找的路径?

      做一个小实验

         File directory = new File("./");
         System.out.println(directory.getAbsolutePath());
      

      观察输出,你会知道 Java 正在查找的当前目录。从那里,只需使用 ./ 说明符来定位您的文件。

      例如,如果输出是

      G:\JAVA8Ws\MyProject\content.

      您的文件存在于“MyProject”文件夹中,只需使用

      File resourceFile = new File("../myFile.txt");
      

      希望这会有所帮助。

      【讨论】:

      • 经过数小时搜索此答案为我提供了解决方案
      【解决方案8】:

      如果没有读取文本文件,请尝试使用更接近的绝对路径(如果您愿意 你可以使用完整的绝对路径,)像这样:

      FileInputStream fin=new FileInputStream("\\Dash\\src\\RS\\Test.txt");
      

      假设绝对路径为:

      C:\\Folder1\\Folder2\\Dash\\src\\RS\\Test.txt
      

      【讨论】:

        【解决方案9】:

        我想在 src/main//js/Simulator.java 中解析“command.json”。为此,我在 src 文件夹中复制了 json 文件,并给出了这样的绝对路径:

        Object obj  = parser.parse(new FileReader("./src/command.json"));
        

        【讨论】:

          【解决方案10】:

          我本可以发表评论,但我对此的代表较少。 萨姆拉特的回答为我完成了这项工作。最好通过以下代码查看当前目录路径。

              File directory = new File("./");
              System.out.println(directory.getAbsolutePath());
          

          我只是用它来纠正我在项目中遇到的问题。一定要使用 ./ 回到当前目录的父目录。

              ./test/conf/appProperties/keystore 
          

          【讨论】:

          • 我正在通过 tomcat 运行我的代码,因此当前目录不是项目文件夹 - 如何定义项目根目录的相对路径?我目前使用的是硬路径:"C:\\Users\\user\\Desktop\\Repositories\\L1_WebShop\\dblogs.log";
          • @TiagoRedaelli 看看这个问题:stackoverflow.com/questions/12843217/…
          【解决方案11】:

          假设您想从FileSystem 类中的resources 目录中读取。

          String file = "dummy.txt";
          var path = Paths.get("src/com/company/fs/resources/", file);
          System.out.println(path);
          
          System.out.println(Files.readString(path));
          

          注意:不需要前导.

          【讨论】:

            【解决方案12】:

            对我来说实际上问题是文件对象的类路径来自&lt;project folder path&gt; or ./src,所以使用File file = new File("./src/xxx.txt");解决了我的问题

            【讨论】:

              【解决方案13】:

              String basePath = new File("myFile.txt").getAbsolutePath(); 您可以将此基本路径用作文件的正确路径

              【讨论】:

                【解决方案14】:

                对我来说,它适用于 -

                    String token = "";
                    File fileName = new File("filename.txt").getAbsoluteFile();
                    Scanner inFile = null;
                    try {
                        inFile = new Scanner(fileName);
                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    while( inFile.hasNext() )
                    {
                        String temp = inFile.next( );  
                        token = token + temp;
                    }
                    inFile.close(); 
                    
                    System.out.println("file contents" +token);
                

                【讨论】:

                  【解决方案15】:

                  如果你想从 src 文件夹中的资源文件夹加载属性文件,使用这个

                  String resourceFile = "resources/db.properties";
                  InputStream resourceStream = ClassLoader.getSystemClassLoader().getResourceAsStream(resourceFile);
                  Properties p=new Properties();  
                  p.load(resourceStream);  
                        
                      System.out.println(p.getProperty("db")); 
                  

                  db.properties 文件包含键和值db=sybase

                  【讨论】:

                    猜你喜欢
                    • 2018-06-24
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-05-04
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-05-23
                    • 2023-04-08
                    • 1970-01-01
                    相关资源
                    最近更新 更多