Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java getResourceAsStream的麻烦,对包的工作方式的困惑

Java getResourceAsStream的麻烦,对包的工作方式的困惑
EN

Stack Overflow用户
提问于 2019-05-21 03:56:26
回答 2查看 184关注 0票数 0

我在高中时通过lwjgl git book短暂地学习了Java,现在又回到了Java。有一段使用'getResourceAsStream‘函数的片段着色器/顶点着色器应该加载到哪里,这让我有点迷惑。

我尝试了不同的方法,并试图调试/打印JVM搜索文件的位置,但是我有点不知所措。我很困惑,但我也更愿意理解为什么这段代码不能在我的机器上工作,以及如何让它工作(使用这种包/类加载方法)。

因为这两个类都共享“main”类,所以我认为JVM会从那里开始搜索“resources”文件夹。但事实似乎并非如此。

我确实认为这与包声明有关,但我还不够理解,无法继续下去。

以下是相关文件和位置...我试图只包含我认为重要的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// project-root/src/main/java/org/lwjglb/engine/Utils.java

package main.java.org.lwjglb.engine;
// other imports...
public class Utils {
    public static String loadResource(String fileName) {
    InputStream in = class.forName(Utils.class.getName()).getResourceAsStream(fileName);
    // 'in' is null after this call
    // other code...
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// project-root/src/main/java/org/lwjglb/game/Renderer.java

import main.java.org.lwjgl.engine.Utils;
// other imports...
public class Renderer {
    public void init() {
        Utils.loadResource("/vertex.vs"); // fails
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// project-root/src/main/resources/vertex.vs

// vertex shader code...

问题是getResourceAsStream()调用返回null,因此以下依赖于有效结果的代码使用java.lang.NullPointerException崩溃。

我应该向getResourceAsStream()传递什么路径才能使它不返回null?

EN

回答 2

Stack Overflow用户

发布于 2019-05-21 13:20:36

假设目录结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|-- src
    `-- test
        |-- java
        |   `-- shaders
        |       `-- ShaderParser.java
        `-- resources
            `-- shaders
                `-- fragmentShader.txt

从"ShaderParser.java“获取资源"fragmentShader.txt”的正确方法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Class clazz = Class.forName(TestUtils.class.getName());
InputStream in = clazz.getResourceAsStream("../../resources/shaders/fragmentShader.txt");

../的意思是“向上遍历一个目录”。路径从src/test/java/shaders/目录开始,因此我们使用../../向上遍历src/test/两次,然后添加路径resources/shaders/fragmentShader.txt的其余部分。

重要的是要记住,在使用Class#getResourceAsStream()时,它使用类所在的包作为基目录。It ONLY使用相对路径,因为它试图使用该类的ClassLoader加载资源。如果提供了完全限定的路径或从项目根开始的路径,则将不起作用。

有关详细信息,请参阅documentation

票数 1
EN

Stack Overflow用户

发布于 2019-05-25 16:54:08

我曾错误地认为Java有一个保留的目录(例如'resources'),它会首先在这个目录中加载文件。有点像python中的Flask。

但是,我现在了解到class.getResourceAsStream()函数要么采用相对路径(到当前“最低”级别的包),要么采用绝对路径(从项目的顶层根)。

此外,我还错误地认为我可以尝试从一个更高级别的包中进行相对路径加载。与在中一样,我在main.java.org.lwjgl.engine.Utils包中,但在查找文件main.resources.vertex.vs时,我可以从'main‘包开始搜索,并传递'resources/vertex.vs’或'resources/vertex.vs‘。我不知道这是否可能,但这感觉是错误的。

相反,解决方案是传递文件位置'/main/resources/vertex.vs‘。这将从project-root开始,并正确加载文件。

我仍然对lwjgl code的工作原理感到困惑,但我认为classPath可能被设置为“main”,所以传递一个绝对路径就可以了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56230865

复制
相关文章
httpd – 对Apache的DFOREGROUND感到困惑
所以我刚刚使用Yum在新的CentOS 7服务器上安装了Apache.我之前已经多次安装过Apache,但我从未见过这样:当我现在运行ps aux时,它总是显示出来
双面人
2019/05/31
4.4K0
引入HBase依赖包带来的麻烦
在一个项目里用到HBase做底层存储,使用maven来管理相关Jar包依赖,用maven来管理依赖包,特别不爽的就是他会将你引入Jar包自己的依赖都搞进来,经常会出现一些类和方法冲突找不到等状况。这次,也被这个搞了一阵子。我依赖了HBase jar之后,tomcat启动后,访问Web页面(使用JSP)的时候,页面直接抛出一堆异常,贴一下关键的:
幽鸿
2020/04/02
8930
令人困惑的TensorFlow!谷歌大脑工程师帮你解决麻烦
导读:虽然对于大多数人来说 TensorFlow 的开发语言是 Python,但它并不是一个标准的 Python 库。这个神经网络框架通过构建「计算图」来运行,对于很多新手来说,在理解其逻辑时会遇到很多困难。本文中,来自谷歌大脑的工程师 Jacob Buckman 将试图帮你解决初遇 TensorFlow 时你会遇到的麻烦。
IT阅读排行榜
2018/08/15
7760
对SMTP协议的一点困惑
大家都知道用账户XXXX@163.com发送邮件到study2y@dormforce.net的时候,是163的服务器通过SMTP协议将邮件发送到DormForce邮箱的,但是163怎么知道DormForce这个邮件系统的IP啊?
深蓝studyzy
2022/06/15
4280
NLP中对"困惑度"感到困惑?
炼丹笔记干货 作者:时晴 困惑度(Perplexity)在NLP中是个最流行的评估指标,它用于评估语言模型学的到底有多好.但是很多炼丹师可能至今对"困惑度"依然感到困惑,这篇就把这个讲清楚.假设我们要做个对话机器人,它功能很简单,就是你跟它说你冰箱有啥,它告诉你还需要买啥,能一起做出美味佳肴.例如"鸡肉,胡萝卜",它能够立马给出5~6种购物清单,这就类似用一个NLP模型,去预估和"鸡肉和胡萝卜"共现较多的食材.但是这样评估并不全面,真实情况是用这个NLP模型可能会产生很多新菜谱,然后按照新菜谱可能可以创造
炼丹笔记
2021/12/20
1.2K0
NLP中对"困惑度"感到困惑?
[字符串匹配][排序应用]小海的困惑
输入的第一行为两个正整数M(0<M<=20) N(0<N<=10000) 分别代表了关键词的个数,以及文本的字符个数。用空格隔开。接下来一行是源文本,其中有N个字符。都是英文字符,大小写敏感。然后为M行,每行为一个数字和一个单词,用空格隔开,分别代表关键词的字符个数K(0<K<=1000)以及关键词。
陈黎栋
2020/02/18
3350
联想的麻烦
联想这两年到底经历了什么?业绩下滑利润跳水,战略上屡屡被人诟病,从恒生指数中踢出,到被美国媒体评为全球最差的科技公司,以及一段2016年的往事,都能成为联想引火上身的导火索,联想到底怎么了? 据传在3GPP举办的有关5G标准的表决会议上,联想集团针对华为主导的5G标准Polar短码方案投票投了反对票,致使Polar方案失败,联想对高通方案投了赞成票,对此联想发声明称这纯属谣言。 可是联想的辟谣并没有打消网友心中的质疑,甚至联想即使拿出证据也无法摘掉“美帝良心”的帽子。 为此,华为官微也在上周辟
人称T客
2018/06/06
8500
关于支付的困惑
今天我妈给我发了一个视频,大致意思是现在有些单车二维码上面会贴新的二维码,那个二维码其实是支付宝转账的二维码,所以扫了以后就会转账。
霖酱
2018/08/02
4480
关于支付的困惑
高昂的PR,开源的困惑
我是个急性子,所以没怎么成功给社区提过PR,除非那个项目是我自己的,或者社区让我有直接Merge的权限。好比之前吐槽完SDL开发太慢后,自己直接fork了一份,然后在上面加功能。
用户2936994
2018/08/27
3890
Java对压缩包的操作(解压缩)
上篇文章说了项目中对根据URL提供的HTML代码中的文件URL进行下载,将下载后的文件存放在服务器上,但是文件下载下来都是ZIP压缩包。那么这篇就来看Java如何多文件进行解压缩操作。
青衫染红尘
2021/01/19
1.5K0
最近遇到的麻烦
https://segmentfault.com/a/1190000018801053
Innei
2021/12/28
5670
Java的包
指的是一个程序的目录,在最早的时候,如果要开发一个程序,只需要定义一个Java文件,而后在这个文件中编写所需要的类文件。
Mirror王宇阳
2020/11/12
1.1K0
三层的困惑
这个问题困惑我已经很久了,从开始学习。NET到现在…… 写三层的时候,遇到这样的情况怎么办? User{     int UserId,     String UserName } Article{     int Id,     int UserId,//作者ID     String Title, } 现在有个表格要显示如下两列:ArticleTitle,UserName 其中每一行对应每一篇文章。 在三层架构中,应该这样做吧: //用于存储最后显示于表示层的数据,相当于Fascade。这是页面上
用户1172223
2018/01/26
5350
令人困惑的strtotime
经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…
猿哥
2019/07/25
4380
“云”的梦想和困惑
什么是云计算?记者抛出的问题,让四川省云计算产业联盟副秘书长邓世雄挠头。尽管已在这个领域浸淫多年,要他深入浅出地解释什么是云计算,还真不是件容易事。 这是个很“冷”的产业。“冷”在始终给人距离感,“高大上”,云里雾里;同时又是个很“热”的产业,投资者纷至沓来,四川已有300多家相关企业。 得云计算者,得未来互联网之天下。梦想很美,但也有困惑和期盼,更有未来的产业路线图。 四川有300多家云计算相关企业,绝大多数是中小企业。谛听科技,就是成都唯一一家做私有云软件的企业。目前,全球已有300万用户选择其云计算产
静一
2018/03/19
1.2K0
建立高效的工作方式
2020 年的工作正式开启,大多数开发者的开工方式是云办公。对开发者来说,云办公意味着什么?如何开始云办公?云办公的发展趋势会怎样?基于此,云加社区联手知乎科技,从知乎云办公相关话题中精选内容落地社区专题「 开发者云办公模式洞察 」。
腾讯云开发者社区
2020/03/20
6530
彻底摆脱乱码的困惑
先给大家出个思考题吧,一个汉字占多少字节?是不是网上搜出的答案五花八门,那么读完本篇文章,我希望你至少可以准确知道这个问题的答案,我觉得就算是收获。
帅地
2020/12/11
1.3K0
彻底摆脱乱码的困惑
Torry的困惑(基本型)
本文最后更新于 1163 天前,其中的信息可能已经有所发展或是发生改变。 #include<iostream> #include<cstring> using namespace std; int arr[1300005]; void f(){ memset(arr,0,sizeof(arr)); arr[0]=1; arr[1]=1; int count=0; for(int i=2;i<1300005;i++){ if(!arr[i]) { count++; for(int
Yuyy
2022/06/28
2370
彻底摆脱乱码的困惑
先给大家出个思考题吧,一个汉字占多少字节?是不是网上搜出的答案五花八门,那么读完本篇文章,我希望你至少可以准确知道这个问题的答案,我觉得就算是收获
全栈程序员站长
2021/04/07
7900
彻底摆脱乱码的困惑
Linux下的^M困惑
我们有时在Windows编辑的文件,放到了Linux环境中,打开文件,可能发现每行结尾多了一个“^M”,导致一些在Windows下能执行的解析程序,放到了Linux中,执行就会报错,问题就出在这个"^M"。
bisal
2020/05/11
1.9K0

相似问题

对机器复制的工作方式感到困惑

11

对JSONP请求的工作方式感到困惑

31

对Redis和它的工作方式感到困惑

10

对捆绑者小组的工作方式感到困惑

10

对rails中的呈现工作方式感到困惑

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文