l89669
我在jar中放置了assets/modname/File.png这么一个文件,如何在mod中读取它?
使用Modname.class..getResourceAsStream("assets/modname/File.png");这句会返回null值

IMENDERDRAGON
错了,应该是:类.class.getResourceAsStream(...);
getResourceAsStream()方法中括号内的路径前要加上"/",表示在这个类所在的包中读取文件,如果不加则表示是在这个类中的子目录中或者是同级目录中读取文件

l89669
IMENDERDRAGON 发表于 2017-7-19 19:53
错了,应该是:类.class.getResourceAsStream(...);
getResourceAsStream()方法中括号内的路径前要加上"/" ...

大佬可不可以举个例子讲解一下

耗子
Modname.class..getResourceAsStream("/assets/modname/File.png");

IMENDERDRAGON
l89669 发表于 2017-7-20 15:54
大佬可不可以举个例子讲解一下

第一:要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类my.class ,同时有资源文件File.png
那么读取它就应该有如下代码:
ImageIO.read(my.class.getResourceAsStream("File.png"));
第二:在me.class目录的子目录下,例如:com.x.y 下有类my.class ,同时在 com.x.y.file 目录下有资源文件那么读取它就应该有如下代码:  
ImageIO.read(my.class.getResourceAsStream("file/File.png"));
第三:不在me.class目录下,也不在子目录下,例如:com.x.y 下有类my.class ,同时在 com.x.file 目录下有资源文件File.png
那么读取它就应该有如下代码:
mageIO.read(me.class.getResourceAsStream("/com/x/file/File.png"));

l89669
非常感谢两位的耐心细致的讲解,简直想送上爱心了QWQ

myq7663512
Mcbbs有你更精彩~

海螺螺
本帖最后由 754503921 于 2017-10-4 11:26 编辑
  1. URL url = new URL("jar:file:/"+modfile.getAbsolutePath()+"!/assets/modname.File.png");
  2. InputStream in = url.openStream();
复制代码


InputStream能干啥我觉得不用多说

在 PreInit 事件有一个 event.getSource() 可以获取 mod文件

l89669
754503921 发表于 2017-10-4 11:24
InputStream能干啥我觉得不用多说

在 PreInit 事件有一个 event.getSource() 可以获取 mod文件 ...

请问一下如何获取modfile的路径?
//另外这个玩意应该不安全因为你也不能保证游戏开始运行后jar不被修改是吧 ;)

海螺螺
l89669 发表于 2017-10-4 22:42
请问一下如何获取modfile的路径?
//另外这个玩意应该不安全因为你也不能保证游戏开始运行后jar不被修改 ...

modfile=mod文件
file n. 文件

如果你能修改jar的话前面几种方法都不安全

l89669
754503921 发表于 2017-10-4 22:51
modfile=mod文件
file n. 文件

你这么强行解释file就有点欺负人了
我想请教的是,如何获取已加载的mod所在的jar文件的路径(做个整合包什么的重命名一下jar很常见的吧,得保证兼容性啊)

海螺螺
l89669 发表于 2017-10-4 23:00
你这么强行解释file就有点欺负人了
我想请教的是,如何获取已加载的mod所在的jar文件的路径(做个整合包 ...
在 PreInit 事件有一个 event.getSource() 可以获取 mod文件



海螺螺
l89669 发表于 2017-10-4 23:00
你这么强行解释file就有点欺负人了
我想请教的是,如何获取已加载的mod所在的jar文件的路径(做个整合包 ...

复杂的方法也有

  1. public static File getSource() {
  2.    try {
  3.        File file = new File(URLDecoder
  4.       .decode(Main.class.getProtectionDomain().getCodeSource().getLocation().toString(), "utf-8")
  5.       .substring(6));
  6.        return file;
  7.      } catch (UnsupportedEncodingException e) {
  8.        return null;
  9.      }
  10. }
复制代码