intellij,gradle项目和资源文件夹以及用于创建文件的逻辑根

时间:2017-09-07 13:47:56

标签: java intellij-idea groovy resources

了解intellij如何使用gradle项目和资源文件夹时遇到问题。

我创建了一个默认的gradle项目,它创建了一个模块' group'和一个模块

查看模块组时,src / main / resources文件夹显示为'资源文件夹' (但它不在独立模块中,其中groovy / java / resources都是灰色的)

enter image description here

因此,在编译代码时,排序似乎有效。

但我尝试在groovy脚本中创建一个像这样的文件

File newFile = new File ("resources/temp.txt")
def fpath = newFile.toURL()
if (!newFile.exists()) {
    println "creating new $fpath file "
    newFile.createNewFile()
}

然而你运行它运行它就像这样失败

creating new file:/D:/Intellij - Azure/quickstart-java/graph/src/main/groovy/playpen/resources/temp.txt file 
Caught: java.io.IOException: The system cannot find the path specified
java.io.IOException: The system cannot find the path specified
    at java_io_File$createNewFile$1.call(Unknown Source)
    at playpen.TinkerPop-Example.run(TinkerPop-Example.groovy:47)

文件似乎有相对根.../src/main/groovy/playpen,这是我的脚本所在的位置。没有src/main/groovy/playpen/resources/因此失败

如果使用File("/resources/temp.txt") and look at the URL it shows as D:\ resources \ temp.txt`默认为与定义脚本的驱动器相同的驱动器。

如果删除资源前缀 - 该文件在playpen中创建 - 再次假设root与源程序脚本相同。

我想要的是从资源中读取文件'文件夹,但除非我转到绝对文件路径,它只是忽略了资源'文件夹,只在groovy源文件夹中查找。

因此,例如,如果我将temp.txt复制到resources文件夹并运行此

File newFile = new File ("temp.txt")
def fpath = newFile.toURL()
if (!newFile.exists()) {
    println "creating new $fpath file "
    newFile.createNewFile()
} else {
    println "reading file at $fpath"
}

它只是在脚本运行的playpen包中创建一个新的temp.txt,并且没有看到来自资源的副本'文件夹

那么'文件名是什么格式'我使用这样的资源'文件夹自然用于解析文件名 - 无需使用绝对文件名

同样如果想以编程方式创建一个文件并将其保存在'资源中。脚本从src/main/groovy/playpen运行的文件夹,其中包含将其放在正确位置的路径名

我在这里遗漏了一些基本内容,无法弄清楚如何从资源文件夹中读取/写入。

如果有人能解释我是如何以编程方式命名文件以使它们与项目相关src/main/resources目录,则非常高兴知道如何

1 个答案:

答案 0 :(得分:0)

最后蛮力无知 - 这个人可能有一个'更聪明',但这个似乎有效。略微调整了一些我工作的代码。

我在这里使用groovy而不是java(只是更少的样板噪音),以及漂亮的文件groovy方法

步骤 - (1)首先使用System.getProperty(“user.dir”)找到IDE /项目的根目录 (2)获取'this'的当前资源文件 - 从ide运行的类 (3)看看资源是否在$ root / out / test / .. dir中 - 它是一个测试,否则它是你的正常代码。 (4)现在设置resourcePath来纠正src / main / resources或src / test / resources /中的“location” - 然后从这个存根构建其余的文件 (5)检查文件是否存在 - 如果是这样删除并重写它(你可以使这个更聪明) (6)创建文件并填写其内容

完成工作后,此文件现在应该出现在您希望的位置。很高兴采取更聪明的方法来做到这一点 - 但对于其他任何被困的人来说,这似乎是诀窍

void exportToFile (dir=null, fileName=null) {

    boolean isTest = false
    String root = System.getProperty("user.dir")
    URL url = this.getClass().getResource("/")
    File loc = new File(url.toURI())
    String canPath = loc.getCanonicalPath()
    String stem = "$root${File.separatorChar}out${File.separatorChar}test"
    if (canPath.contains(stem))
        isTest = true

    String resourcesPath
    if (isTest)
        resourcesPath = "$root${File.separatorChar}src${File.separatorChar}test${File.separatorChar}resources"
    else
        resourcesPath = "$root${File.separatorChar}src${File.separatorChar}main${File.separatorChar}resources"

    String procDir = dir ?: "some-dir-string"
    if (procDir.endsWith("$File.separatorChar"))
        procDir = procDir - "$File.separatorChar"
    String procFileName = fileName ?: "somedefaultname"
    String completeFileName
    File exportFile = "$resourcesPath${File.separatorChar}$procDir${File.separatorChar}${procFileName}"
    exportFile = new File(completeFileName)
    println "path: $procDir, file:$procFileName, full: $completeFileName"

    exportFile.with {
        if (exists())
            delete()
        createNewFile()
        text = toString()
    }

}