当前位置: 首页 > 知识库问答 >
问题:

Maven:java.io.FileNotFoundExcture当尝试打开文件从资源与Intellij或使用java命令与jar

亢建白
2023-03-14

我已经将intellij中“Java8在运行”一书中的github项目作为maven项目导入。

模块结构如下所示:

然后,我直接从Intellij(右键单击-

public static void main(String ...args) throws IOException{

    // method we want to refactor to make more flexible
    String result = processFileLimited();
    System.out.println(result);

    System.out.println("---");

    String oneLine = processFile((BufferedReader b) -> b.readLine());
    System.out.println(oneLine);

    String twoLines = processFile((BufferedReader b) -> b.readLine() + b.readLine());
    System.out.println(twoLines);

}

public static String processFileLimited() throws IOException {
    try (BufferedReader br =
                 new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))) {
        return br.readLine();
    }
}


public static String processFile(BufferedReaderProcessor p) throws IOException {
    try(BufferedReader br = new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))){
        return p.process(br);
    }

}

public interface BufferedReaderProcessor{
    public String process(BufferedReader b) throws IOException;

}

然后,我得到一个FileNotFoundExcema:

Exception in thread "main" java.io.FileNotFoundException: lambdasinaction\chap3\data.txt

如果执行一个“maven包”,那么在jar中,数据将被删除。txt文件直接包含在chap3文件夹/包中,但如果执行以下操作,则会出现相同的错误:

java -classpath lambdasinaction-1.0.jar lambdasinaction.chap3.executeAround
Exception in thread "main" java.io.FileNotFoundException: lambdasinaction\chap3\data.txt (Le chemin d?accès spécifié est introuvable)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileReader.<init>(Unknown Source)
        at lambdasinaction.chap3.ExecuteAround.processFileLimited(ExecuteAround.java:23)
        at lambdasinaction.chap3.ExecuteAround.main(ExecuteAround.java:9)

1-为什么不直接从intellij运行?该文件正确地位于资源文件夹中。

2-这可能是最重要的:为什么当直接从命令行执行程序时它不运行?

谢谢你的帮助

共有2个答案

微生鸿轩
2023-03-14

当您执行Java程序时,相关的文件名,如lambdasinaction/chap3/data。根据当前工作目录解析txt

  • 当您使用Intellij默认设置启动程序时,当前目录就是包含的目录。idea文件夹(还包含pom.xml*.iml*.ipr等)

文件放在src/main/Resources下,因此除非当前目录是资源,否则您将始终得到FileNotFoundExc0019。一旦部署,您的程序可能找不到您的资源。

好消息是,目录对于Maven和Maven兼容工具(如Intellij)是特殊的,因为内容可以作为类路径资源使用——这意味着您将始终能够使用

getClass().getResourceAsStream("/lambdasinaction/chap3/data.txt");

注意:我没有使用文件系统(FileReader)来解析文件名,而是使用(绝对)类路径资源标识符。

壤驷英叡
2023-03-14

使用“src/main/resources/lambdasinaction/chap3/data.txt”代替lambdasinaction/chap3/data.txt”

 类似资料:
  • 问题内容: 我一直在看代码,并且看到了尝试资源的机会。我以前使用过标准的try-catch语句,看起来它们在做同样的事情。所以我的问题是“ 尝试使用资源”与“尝试捕获 ”之间的区别是什么,哪个更好。 这是尝试使用资源: 问题答案: 尝试使用资源的重点是确保可靠地关闭资源。 当你不使用try-with-resources时,存在一个潜在的陷阱,称为异常屏蔽。当try块中的代码引发异常,而finall

  • 我需要打开N个多播套接字(其中N来自参数列表的大小)。然后,我将向循环中的N个套接字中的每个套接字发送相同的数据,最后关闭每个套接字。我的问题是,如何使用try with resources块来实现这一点?以下是我将如何使用单个资源来实现这一点: 我能想到的使用多个端口执行此操作的唯一方法如下: 有没有一种更简洁的方法来实现这一点,或者我提出的解决方案是否尽可能好?

  • try-with 功能如何适用于已声明为 变量? 我假设这会导致空指针异常,当它尝试调用上的变量,但它运行没有问题:

  • 我在maven项目的src/main/resource文件夹中下载了.sh文件,我正在通过下面的代码阅读它 如果我使用jar EX作为应用程序运行:- java-jar runscript.jar SCHEMA_NAME /users/ideaprojects/runscript/target/file:/users/ideaprojects/runscript/target/runscripts

  • 我正在尝试使用appium打开/关闭设备。我在Appium python客户端修改了Webdriver.py。我添加了一个关闭电源的功能和命令。它不起作用。有人能帮我用Appium命令开/关电源吗?PS -我不能使用adb命令

  • 问题内容: 我是的新手,我想知道对于资源来说,我是否必须为每个添加一个,否则它将与上面的代码一起使用 问题答案: 通过在 块中声明所有资源,可以尝试将资源与多个资源一起使用,并且此功能是 Java 7中 引入的,而不是 Java 8中 引入的。如果有多个资源,则可以如下所示 在此示例中,该语句包含两个用分号分隔的声明: ZipFile 和 BufferedWriter 。当它紧随其后的代码块终止时