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找到一个文件,那么我会假设该文件存在
# 1 楼答案
您的文件测试=新文件(cFile)吗?您的cFile是否使用正确的路径正确创建?也许最后一个打印语句只是在错误的路径上拾取?但实际上,你并没有一个文件。你手动检查过了吗
# 2 楼答案
简短回答:不要假设URL的“路径”是文件系统路径名
对。(如果您向我们展示原始URL的样子,那就太好了……不过我可以猜得到。)
好的,除非URL有协议“file:”,否则我不希望这样做
URL中的路径是协议处理程序要解析的路径。其思想是使用
URL::openStream
打开一个指向URL命名的资源的流,然后读取它。协议处理程序负责解释路径(etc)和设置流对于“file:”URL,协议处理程序将解析文件系统中的路径,并为您提供读取文件的流
对于“http:”URL,协议处理程序建立到服务器的连接,发送GET请求,并返回一个流以读取响应体
对于“jar:”URL,协议处理程序打开jar文件,找到jar文件中的条目,并向您提供一个流来读取它
等等
如果您看一下这些,那么只有在“file:”的情况下,才有合理的期望将URL的路径组件作为文件系统路径名来处理
查看问题中的路径名:
我推测原始URL是:
因此,对“jar:”协议处理程序来说:
JAR文件协议处理程序知道如何做到这一点。但是(显然)这个
File
类没有。。。因为该“路径”不是文件系统路径名你如何解决这个问题取决于你真正需要什么
getClass().getResourceAsStream(...)
李>File
作为临时文件李>如果你是因为想写“文件”才这样做的,我建议你放弃这个想法。应用程序尝试更新其资源是一个坏主意。在某些情况下,它根本不起作用