Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java资源获取数据时未返回任何数据_Java_File - Fatal编程技术网

从Java资源获取数据时未返回任何数据

从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

我有一个包含默认文件(.route)的程序。我将其存储在jar文件中,地址为:

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;

}