从Java资源获取数据时未返回任何数据
我有一个包含默认文件(.route)的程序。我将其存储在jar文件中,地址为:从Java资源获取数据时未返回任何数据,java,file,Java,File,我有一个包含默认文件(.route)的程序。我将其存储在jar文件中,地址为: src/ resources/ defaultRoute.route 这是我的密码: public static final String DEFAULT_ROUTE; static { URL resource = PathCreator.class.getResource("/resources/defaultRoute.route"); String output
src/
resources/
defaultRoute.route
这是我的密码:
public static final String DEFAULT_ROUTE;
static {
URL resource = PathCreator.class.getResource("/resources/defaultRoute.route");
String output = "";
try {
output = new String(Files.readAllBytes(Paths.get(resource.toURI())));
System.out.println(output);
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
System.exit(-1);
}
DEFAULT_ROUTE = output;
}
但是,控制台只打印一个空字符串。我唯一的猜测是文件路径是错误的,但是如果我更改它,我会得到一个空指针异常(因此我假设它是正确的)。我的目标是将文件复制到用户创建新路由的指定位置。我尝试了很多技术,所有这些都以目标文件为空结束。(在这种技术中,字符串稍后会复制到新文件中。)
提前谢谢
如果您感兴趣,以下是defaultRoute.route文件的内容:
{
"route": [],
"start": {
"x": "0.0",
"y": "0.0",
"angle": "0.0"
}
}
您不应在资源路径中包含“资源”目录。试试这个
PathCreator.class.getResource("/defaultRoute.route")
资源路径中的第一个“/”表示资源根目录(在您的例子中是“资源”)。出于某种奇怪的原因,它开始返回正确的数据(在导出和在eclipse中)。在尝试@AndrewFomin的答案时,我收到了一个
NullPointerException
。对于所有感兴趣的人,以下是我的结果,由网站提供帮助:
我不知道为什么
resource
文件夹没有像大家在Andrew Fomin回答的评论中所说的那样与src
文件夹合并。一旦打包,这无论如何都不会起作用;您无法可靠地使用文件
作为资源。改用getResourceAsStream
。(还有,调用newstring(String)
)从来都不是一个好的理由)@chrylis你能举个例子说明如何使用它吗?我所有的尝试都失败了(另外,新字符串
用于将字节数组转换为字符串。谢谢!我没有注意到您使用的是readAllBytes
,很抱歉;在这种情况下,我会注意到您应该始终使用接受字符集
的构造函数(通常为UTF-8)。您需要调试您的应用程序,逐步检查语句的每一部分以查看返回的值。我要注意的是,您的“默认值”看起来应该只是Route
类的纯“空”副本,而JSON似乎没有进入其中。我不会将其表述为“means resource root dir”。我更愿意说“意味着类加载器根”。(那么,在这个构建过程中,resources目录作为类路径根被构建过程处理,这一事实协调了这两个视图,但需要注意的是,在运行时“/”没有单一且特定的用户目录。它是根目录,类路径的每个组件都可以参与其中-modulo classloader visibility)。你是对的。在运行时,它是类路径根目录。但就项目结构而言,我们可以称它为资源根目录,为什么不呢。关键是,此代码可以生成NPE(如果路径错误)或者正确地阅读文件。不是吗?我同意它是有效的。我只是一个过于热心的读者,喜欢理解/解释它的工作原理,我宁愿让读者知道运行时资源发现比他们的“project explorer IDE视图”更重要建议。根据您的回答,您可能会认为src/java路径中的xyz.route文件是不可访问的,因为/is src/resources,而不是src/java。哦,好吧……也许我走得太远了。src/java中的资源文件很奇怪:)但您的评论是绝对正确的,优秀的专家会尽可能做到最好!对于粗略,src/java和src/resources都在runtime@AndrewFomin由于某种原因,文件开始返回正确的数据。但是,它仅在资源文件夹仍在路径中时才起作用(/resources/defaultRoute.route
)。你知道为什么会这样吗?删除资源部分时,它在导出的.jar上也不起作用。这取决于jar的构建方式。通常将SRC/java和SRC/资源视为“根”,这意味着“java”和“资源”不是运行时路径的一部分。但是可以配置任何东西,显然,您的装配系统被配置为将SRC/java视为根(用于编译的类),而SRC作为另一个(对于其他所有的)。有点奇怪,但有可能。唯一知道的方法是描述jar是如何构建的(maven使用什么pom?Ant使用什么脚本?Gradle?…)@GPI我只是使用Eclipse的默认值。(右键单击项目>导出>可运行jar文件)
public static final String DEFAULT_ROUTE;
static {
InputStream resource = PathCreator.class.getResourceAsStream("/resources/defaultRoute.route");
String output = "";
try {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = resource.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
output = new String(buffer.toByteArray());
} catch (IOException e) {
e.printStackTrace();
System.exit(-1);
}
DEFAULT_ROUTE = output;
}