有什么区别:
InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)
Run Code Online (Sandbox Code Playgroud)
和
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
Run Code Online (Sandbox Code Playgroud)
和
InputStream is = this.getClass().getResourceAsStream(fileName)
Run Code Online (Sandbox Code Playgroud)
每个人何时比其他人更适合使用?
我想要读取的文件在类路径中作为我的类来读取文件.我的类和文件位于同一个jar中,并打包在EAR文件中,并部署在WebSphere 6.1中.
我想在Kotlin写一个Spek测试.测试应从该src/test/resources文件夹中读取HTML文件.怎么做?
class MySpec : Spek({
describe("blah blah") {
given("blah blah") {
var fileContent : String = ""
beforeEachTest {
// How to read the file file.html in src/test/resources/html
fileContent = ...
}
it("should blah blah") {
...
}
}
}
})
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Boot和json-schema-validator.我正在尝试读取jsonschema.json从该resources文件夹调用的文件.我尝试了几种不同的方法,但我无法让它发挥作用.这是我的代码.
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);
Run Code Online (Sandbox Code Playgroud)
这是文件的位置.
在这里,我可以在文件classes夹中看到该文件.
但是当我运行代码时,我得到以下错误.
jsonSchemaValidator error: java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
我在代码中做错了什么?
我理解Class.getResource()和ClassLoader.getResource()之间有什么区别? 从自己的代码,那
getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)
是完全相同的
getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)
getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)
在可执行jar文件中返回null,而
getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)
返回正确的URL.
Since Class.getResource()代表ClassLoader.getResource()在删除前导斜杠后,我希望这些调用是相同的,但显然它们不是这种情况.即使特殊类加载器附加到特定类,每次调用它仍然应该是相同的,再次导致相同的行为.
所以,问题是:是否存在以下代码在第一次调用时返回null但第二次调用的正确URL的任何明显情况?
package com.example;
import java.net.URL;
public class ResourceTest {
public void run() {
URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png");
System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1);
URL iconUrl2 = getClass().getResource("/path/image.png");
System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2);
}
public static void main(String[] args) {
ResourceTest app = new ResourceTest();
app.run();
}
}
Run Code Online (Sandbox Code Playgroud) 模块与open关键字之前和之后有什么区别?
例如:
open module foo {
}
module foo {
}
Run Code Online (Sandbox Code Playgroud) 到目前为止,直到非模块化的java,你只需要放入一个文件,src/main/java/resources确保它在classpath中,然后加载它
file = getClass().getClassLoader().getResourceAsStream("myfilename");
Run Code Online (Sandbox Code Playgroud)
来自类路径中的任何位置.
现在有了模块,情节变浓了.
我的项目设置如下:
module playground.api {
requires java.base;
requires java.logging;
requires framework.core;
}
Run Code Online (Sandbox Code Playgroud)
配置文件放在里面src/main/resources/config.yml.
项目运行
java -p target/classes:target/dependency -m framework.core/com.framework.Main
Run Code Online (Sandbox Code Playgroud)
由于主类不在我自己的项目中,而是在外部框架模块中,因此无法看到config.yml.现在的问题是,有没有办法以某种方式将我的配置文件放入模块或打开它?我是否必须更改框架上游加载文件的方式?
我尝试在module-info中使用"exports"或"opens",但它想要一个包名,而不是文件夹名.
如何以最佳实用的方式实现这一点,以便它可以像Java 8一样工作,并尽可能少地进行更改?
我正在尝试从我的war存档中读取文本文件,并在运行时在facelets页面中显示内容.我的文件夹结构如下
+ war archive> + resources> + email> + file.txt
我尝试使用以下代码读取resources/email/file.txt文件夹中的文件
File file = new File("/resources/email/file.txt");
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StringBuffer buffer = new StringBuffer();
if (reader != null) {
String line = reader.readLine();
while (line != null) {
buffer.append(line);
line = reader.readLine();
// other lines of code
Run Code Online (Sandbox Code Playgroud)
然而问题是当我运行上面代码的方法时,FileNotFoundException抛出了A. 我也尝试使用以下代码行来获取文件,但是没有成功
File file = new File(FacesContext.getCurrentInstance()
.getExternalContext().getRequestContextPath() + "/resources/email/file.txt");
Run Code Online (Sandbox Code Playgroud)
我还是得到了 …
假设我有两个项目,A和B. Java项目,如果这很重要的话.
项目A包含一堆代表核心类型和元素的XSD文件.它们都放在一个名为"定义"的包中.这内置了project-a.jar.
项目B代表一个扩展项目,允许定义自己的类型和元素.我创建了一个新模式并将其放在"definition.extension"包中.这内置了project-b.jar.
现在,对于项目B中的XSD,我究竟应该把它作为schemaLocation一个include什么?
schemaLocation="../core-types.xsd"没有用(我知道,它需要一个URI),但究竟什么是正确的或标准的方法呢?谷歌发现我有更多的人问这个问题,那就是处理这个问题的正确方法的明确标准方法.
它不能是我schemaLocation在运行期间以编程方式调整...或者我需要一个动态替换schemaLocation编译期间的构建步骤/脚本......对吗?
我不是在寻找像"把它们放在共享位置"这样的答案.我正在寻找更多的开发环境,使用相对引用而不是硬编码引用.
仅供参考,我正在使用IntelliJ IDEA,以防有特定于IDE的方法.
我用公共和私有RSA密钥创建了一个JKS文件.当我使用外部路径(如c:/file.jks)加载此文件时,程序就像魅力一样执行.但是,如果我尝试从类路径加载此相同的文件,我得到此异常:
java.io.IOException: Invalid keystore format
Run Code Online (Sandbox Code Playgroud)
这是用于加载jks的代码:
KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream stream=this.getClass().getResourceAsStream("/lutum.jks") ;
keyStore.load(stream,passe);
Run Code Online (Sandbox Code Playgroud)
唯一的区别是我在外部加载时使用FileInputStream和完整路径.我做错了什么?
java ×8
java-9 ×2
classloader ×1
classpath ×1
encryption ×1
inputstream ×1
java-8 ×1
java-module ×1
java-platform-module-system ×1
jks ×1
jsf ×1
kotlin ×1
maven ×1
module-info ×1
spring ×1
spring-boot ×1
xsd ×1