【问题标题】:File not Found in Project root folder在项目根文件夹中找不到文件
【发布时间】:2014-09-23 13:08:21
【问题描述】:

我运行以下代码,程序返回 FileNotFoundException:

public void read()
{
    Scanner scanner = new Scanner(new File("/project_folder_name/data.in"));
    while (scanner.hasNextLine())
    {
        System.out.println(scanner.nextLine());
    }
}

我已尝试使用项目根文件夹、包文件夹和任意文件夹(即 /User/.../Desktop/data.in)中的 data.in 文件和我总是得到相同的结果:

例子:

//relative path (for when data.in is within project root folder)
Scanner scanner = new Scanner(new File("data.in"));

//path for when data.in is moved in package
Scanner scanner = new Scanner(
new File("/project_folder_name/source_folder_name/package_name/data.in"));

这些都不起作用。

我在 Eclipse IDE 中运行程序。

【问题讨论】:

  • 如果你使用 windows 你应该使用 \ 而不是 /
  • 在 Eclipse 中我相信我必须使用 / 否则它会返回错误:Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
  • 是的,使用正斜杠 (/) 是正确的。即使在 Windows 中,Java 使用正斜杠作为文件分隔符来解析文件路径,并且使用反斜杠 () 作为转义字符,从而改变字符串的含义。
  • 你应该用 \\ 转义 \
  • 好吧,您可以转义反斜杠并将其用作文件分隔符,所以我想这是一个解决方案,但我觉得使用正斜杠更清晰、更通用,因为这确实有效在 Windows 和 Unix 上。

标签: java eclipse file file-io java.util.scanner


【解决方案1】:

我不得不使用 try/catch 来避免异常中断程序:

public void read()
    {
        try
        {
            Scanner scanner = new Scanner
                    (new File("data.in"));
            while (scanner.hasNextLine()) 
            {
                System.out.println(scanner.nextLine());
            }
        }
        catch(IOException ex)
        {
            ex.printStackTrace();
        }
    }

在这种情况下,这也适用于:

"C:\\Users\\...\\Desktop\\data.in"
"/Users/.../Desktop/data.in"
"data.in"(if it's in the root folder)

【讨论】:

  • 出于好奇,每种情况下打印的内容是什么?
  • 它打印了 data.in 中写入的内容。就我而言,我只是写了类似的东西:1 2 3 4,这就是它打印的内容。
  • 是的,无论我使用哪种“格式”:Windows 路径、Eclipse 路径或相对路径,如果你可以这样称呼的话。
【解决方案2】:

传递给new File() 的路径是文件系统路径。您传递的路径 ("/project_folder_name/data.in") 是 Eclipse 路径。文件系统等价物是${YOUR_WORKSPACE_LOCATION}/project_folder_name/data.in,其中``${YOUR_WORKSPACE_LOCATION}` 是您工作区位置的绝对文件系统路径。你如何将它纳入你的测试代码是一个相当大的问题。如果您可以使用 Eclipse 启动器,您可以在启动器的配置中使用 ${resource_loc} Eclipse 变量。

另一种选择是使用相对路径。当 Eclips 运行您的测试时,当前工作目录是项目的根目录。所以你可以只使用"data.in"。或者更好的是,使用 "src/test/resources/data.in"(用于 Mavenized 项目)。

【讨论】:

  • 我不认为这是文件路径问题。在我使用 try/catch 之后,它适用于现有文件,并且在检查文件是否存在之前不再遇到 FileNotFoundException。
【解决方案3】:

如果您使用的是 Windows,则应该使用 \ 而不是 /。你也可以给出绝对路径 ex。 C:\folder\folder\data.in 或者您可以将文件放在类路径中并执行 File("data.in") 或相对于类路径 File("\folder\data.in")。不要忘记将 \ 转义 2 \。

尝试将文件放在项目文件夹的根目录中,然后执行 new File("data.in")。 将文件复制并粘贴到eclipse中的根文件夹(项目文件夹)

改变

 Scanner scanner = new Scanner(new File("/project_folder_name/data.in"));

 Scanner scanner = new Scanner(new File("data.in"));

【讨论】:

  • 我不认为这是正确的... Java 总是使用 '/' 作为文件路径中的文件分隔符。像这样将'\'放在字符串中可能会导致不必要的字符转义,并使字符串无效
  • 在您要求解释之前不要投反对票
  • 这对我有用,刚刚测试过你做错了什么,因为你可以指定绝对路径或相对路径(项目的根文件夹)。
  • 我也尝试过使用 \\.我不再得到无效的转义序列。但是,我仍然得到 FileNotFoundException。
  • 我否决了它,因为您的初始答案不正确,使用单个反斜杠作为文件分隔符会导致字符串文字中的转义导致字符串无效,但您的更新已经纠正了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多