有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java文件名、目录名或卷标语法不正确Kotlin Maven

我在启动打包的jar时遇到了这个错误。当我从IDE运行它时,它不会给出错误并运行

java.io.FileNotFoundException: file:\C:\Development\Kotlin\AccountTool\target\AccountTool-1.0-SNAPSHOT-jar-with-dependencies.jar!\accounts.json (The filename, directory name or volume label syntax is incorrect)
    at java.io.FileInputStream.open0(Native Method)
    at java.io.FileInputStream.open(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileReader.<init>(Unknown Source)
    at com.martacus.accounttool.ToolView$handler.readData(Tool.kt:41)
    at com.martacus.accounttool.ToolView.<init>(Tool.kt:56)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at tornadofx.FXKt.find(FX.kt:238)
    at tornadofx.App.start(App.kt:27)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source)
    at com.sun.javafx.application.LauncherImpl$$Lambda$52/31866147.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$45/2900468.run(Unknown Source)
    at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$48/4210449.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source)
    at com.sun.javafx.application.PlatformImpl$$Lambda$47/24077489.run(Unknown Source)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source)
    at com.sun.glass.ui.win.WinApplication$$Lambda$36/1828305.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

ide中的代码和文件层次结构: enter image description here

fun readData(){
    accounts.clear()
    var readFile = ToolView::class.java.classLoader.getResource("accounts.json").file
    println(readFile)
    FileReader(readFile).use{
        var account = gson.fromJson(it, Array<Account>::class.java) ?: return
        for(i in account){
            accounts.add(i)
        }
    }

}

。jar根目录:

enter image description here

我不知道出了什么问题,也不知道为什么会给我这个错误。在stackoverflow和google上搜索并没有给我提供正确的答案。我希望这里有人能帮助我,如果你需要更多的信息,请告诉我

谢谢


共 (1) 个答案

  1. # 1 楼答案

    当一个资源被打包到一个jar中时,它不再作为文件系统中的文件可用。因此,不能使用标准API作为File()FileReader()文件系统来访问资源的内容

    相反,您应该使用^{}^{}方法打开资源流,并从该流中读取内容:

    val stream = ToolView::class.java.classLoader.getResourceAsStream("accounts.json")
    
    stream.reader().use {
        println(it.readText())
    }