欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(Java、Scala)读取IDEA maven项目resource下相对路径文件

程序员文章站 2022-05-10 11:49:47
...

在使用maven创建的项目中,在编译时会在项目下生成target文件夹,其下面的class文件夹里面生成src->main中的数据如resources中的文件或者是scala文件夹下面的.scala文件的“倒影”。

所以寻找文件的相对位置时,要先找到target这个目录下的地址,然后再找具体的文件。

如图所示,要读取resource下Excel文件夹下的Excel文件,target目录下已经生成了对应的文件:

(Java、Scala)读取IDEA maven项目resource下相对路径文件

使用下列方法,可获取${项目名}/target/classes/绝对路径

//获取编译后生成的${项目名}/target/classes/路径
val resource: URL = this.getClass.getClassLoader.getResource("")
println("resource1 => " + resource)

打印结果如下:

resource1 => file:/E:/mycode/Spark/mylearn/target/classes/

拼接${项目名}/target/classes/路径与相对路径excel/test11.xlsx,即可获取到test11.xlsx文件数据

def readExcelFile(spark:SparkSession,className:Class[_],file:String) ={

    //获取编译后生成的${项目名}/target/classes/路径
    val resource: URL = className.getClassLoader.getResource("")

    //拼接resource路径与文件的相对路径
    //拼接完成为file:/D:/IdeaProjects/ZHBR_BIGDATA/target/classes/excel/test11.xlsx
    //file为要读取的文件的相对路径
    val filePath = resource+file

    //读取excel数据,并返回数据
    spark.read.format("com.crealytics.spark.excel").
      option("useHeader", "true").        //是否有表头作为表的字段名
      option("treatEmptyValuesAsNulls", "true").        //是否将空值设置为null
      option("inferSchema", "true").        //是否自动推断字段类型
      option("addColorColumns", "False").       //是否添加颜色
      load(filePath)
  }

Excel文件夹下两个文件数据结构相同,如同时读取一个文件夹下的多个文件,可参考:

def readMoreExcelFile(spark:SparkSession,className:Class[_],files: String) ={

    //获取编译后生成的${项目名}/target/classes/路径
    val resource: URL = className.getClassLoader.getResource("")

    //拼接resource绝对路径与files相对路径,拼接完成为file:/D:/IdeaProjects/ZHBR_BIGDATA/target/classes/excel
    //需要将路径前的'file:/'去掉,否则报错
    //files为要读取的文件夹相对路径
    val path:String = resource.toString+files
    val filePath = path.substring(5)

    //创建file文件夹
    val dir = new File(filePath)

    //将dir文件夹内文件排序,并转为String格式
    val excelFiles = dir.listFiles.sorted.map(f => f.toString)

    //读取excel数据
    val dfs = excelFiles.map(file => {
      spark.read.format("com.crealytics.spark.excel").
        option("useHeader", "true").        //是否有表头作为表的字段名
        option("treatEmptyValuesAsNulls", "true").        //是否将空值设置为null
        option("inferSchema", "true").        //是否自动推断字段类型
        option("addColorColumns", "False").       //是否添加颜色
        load(file)
    })

    //合并数据,并返回
    dfs.reduce(_.union(_))
  }
相关标签: Java spark Scala