有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么我可以从getClass()获取有效的url。getResource(),但返回的url创建了一个不存在的文件

我正在尝试将一些数据加载到AWS lambda中,并使用getClass()。getResource()来执行此操作。这将返回一个很好的URL,在日志中似乎打印出一个合理的URL;但是,当我尝试基于该路径创建文件时,我会得到一个调用时会显示的文件。exists()返回false

如果我运行下面的代码,第一个print语句将给出“returns exists:false”

同时,第二条print语句给出了“testpath:/file:/var/task/lib/MyLambda-1.0.jar!/com/my/package/folders/file.end!”这几行的内容

File test = new File(cFile);
System.out.println("exists: " + test.exists());
System.out.println("test path: " + test.getAbsolutePath());

不知道为什么会这样。如果Java找到一个文件,那么我会假设该文件存在


共 (2) 个答案

  1. # 1 楼答案

    您的文件测试=新文件(cFile)吗?您的cFile是否使用正确的路径正确创建?也许最后一个打印语句只是在错误的路径上拾取?但实际上,你并没有一个文件。你手动检查过了吗

  2. # 2 楼答案

    简短回答:不要假设URL的“路径”是文件系统路径名


    I am trying to load some data into an AWS lambda and am using getClass().getResource() to do so. This returns a nice URL that in logs seemingly prints out a plausible url;

    对。(如果您向我们展示原始URL的样子,那就太好了……不过我可以猜得到。)

    However, when I try and make a file based on that path, I get a file that when I call .exists() returns false.

    好的,除非URL有协议“file:”,否则我不希望这样做

    URL中的路径是协议处理程序要解析的路径。其思想是使用URL::openStream打开一个指向URL命名的资源的流,然后读取它。协议处理程序负责解释路径(etc)和设置流

    • 对于“file:”URL,协议处理程序将解析文件系统中的路径,并为您提供读取文件的流

    • 对于“http:”URL,协议处理程序建立到服务器的连接,发送GET请求,并返回一个流以读取响应体

    • 对于“jar:”URL,协议处理程序打开jar文件,找到jar文件中的条目,并向您提供一个流来读取它

    • 等等

    如果您看一下这些,那么只有在“file:”的情况下,才有合理的期望将URL的路径组件作为文件系统路径名来处理


    查看问题中的路径名:

    file:/var/task/lib/MyLambda-1.0.jar!/com/my/package/folders/file.end
    

    我推测原始URL是:

    jar:file:/var/task/lib/MyLambda-1.0.jar!/com/my/package/folders/file.end
    

    因此,对“jar:”协议处理程序来说:

    1. 查找URL“file:/var/task/lib/MyLambda-1.0.jar”标识的资源
    2. 将其作为JAR文件流打开
    3. 在JAR文件的名称空间中找到条目“/com/my/package/folders/file.end”
    4. 打开一个流以读取该条目的内容

    JAR文件协议处理程序知道如何做到这一点。但是(显然)这个File类没有。。。因为该“路径”不是文件系统路径名


    你如何解决这个问题取决于你真正需要什么

    • 如果您只需要一个流来读取资源,请使用getClass().getResourceAsStream(...)
    • 如果它必须是文件系统中的一个文件,那么您可能必须获得流(见上文),将其复制到一个临时文件,并使用File作为临时文件

    如果你是因为想写“文件”才这样做的,我建议你放弃这个想法。应用程序尝试更新其资源是一个坏主意。在某些情况下,它根本不起作用