我想知道Class.getResource()和之间的区别是什么ClassLoader.getResource()?
编辑:我特别想知道文件/目录级别是否涉及任何缓存.如"在类版本中缓存的目录列表?"
以下AFAIK应该基本上做同样的事情,但它们不是:
getClass().getResource()
getClass().getClassLoader().getResource()
Run Code Online (Sandbox Code Playgroud)
我在摆弄一些报告生成代码时发现了这一点,该代码WEB-INF/classes/从该目录中的现有文件创建了一个新文件.当使用Class中的方法时,我可以找到部署时使用的文件getClass().getResource(),但在尝试获取新创建的文件时,我收到了一个null对象.浏览目录会清楚地显示新文件存在.文件名前面带有正斜杠,如"/myFile.txt"中所示.
另一方面,ClassLoader版本getResource()确实找到了生成的文件.根据这种经验,似乎存在某种目录列表的缓存.我是对的,如果是的话,这会记录在哪里?
从API文档上Class.getResource()
查找具有给定名称的资源.搜索与给定类关联的资源的规则由类的定义类加载器实现.此方法委托给此对象的类加载器.如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResource(java.lang.String).
对我来说,这是"Class.getResource真正调用它自己的类加载器的getResource()".这和做的一样getClass().getClassLoader().getResource().但显然不是.有人可以请我为此事提供一些启示吗?
我试图从我的 json 文件中读取,我在 root 中拥有它,但是当我打包到 jar 时,该文件没有附带。现在我将 json 文件放在“资源”文件夹中。
我的代码:
@Component
class DefaultData {
@Autowired
private lateinit var gameOfThronesService: GameOfThronesService
@PostConstruct
fun initializeDefault() {
val reader = JsonReader(FileReader("game-of-thrones.json"))
val gameofthronesCharacters: List<GameOfThronesDto> = Gson().fromJson(reader, object : TypeToken<List<GameOfThronesDto>>() {}.type)
println("-----> JSON Data <-----")
gameofthronesCharacters.forEach{ println(it) }
gameOfThronesService.createCharactersFromJson(gameofthronesCharacters)
}
}
Run Code Online (Sandbox Code Playgroud)
当我在 root 中有 json 文件时这有效,但在“资源”文件夹中找不到它,如何解决这个问题?
我也试过:How to read a text file from resources in Kotlin?
然后我收到以下错误:
(File name too long)
at java.io.FileInputStream.open0(Native Method) ~[na:1.8.0_181]
at java.io.FileInputStream.open(FileInputStream.java:195) ~[na:1.8.0_181]
at java.io.FileInputStream.<init>(FileInputStream.java:138) ~[na:1.8.0_181]
at java.io.FileInputStream.<init>(FileInputStream.java:93) …Run Code Online (Sandbox Code Playgroud) 我需要读取一个文本文件,并且readLines()我已经找到了这个问题,但是答案中的代码总是使用javaClass;的一些变体。它似乎只能在类中工作,而我只使用一个简单的 Kotlin 文件,没有声明类。这样写在语法上是正确的,但它看起来真的很难看,而且它总是返回null,所以它一定是错误的:
val lines = object {}.javaClass.getResource("file.txt")?.toURI()?.toPath()?.readLines()
Run Code Online (Sandbox Code Playgroud)
当然我可以像这样指定原始路径,但我想知道是否有更好的方法:
val lines = File("src/main/resources/file.txt").readLines()
Run Code Online (Sandbox Code Playgroud)