使用Scala获取GCS文件创建时间时Paths.get路径异常求助
解决GCS文件路径被Paths.get简化导致的创建时间获取问题
直接用Java NIO的Paths.get处理GCS路径时,会自动合并连续斜杠,把gs://变成gs:/,导致无法正确识别GCS资源。可以通过以下两种方式解决:
方式一:使用GCS官方Java客户端库
这是最可靠的方案,直接调用GCS API获取文件属性:
- 先添加依赖(以SBT为例):
libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.22.0"
- 获取文件创建时间的代码:
import com.google.cloud.storage.StorageOptions import java.time.Instant // 初始化GCS客户端 val storage = StorageOptions.getDefaultInstance.getService // 指定bucket和文件路径 val blob = storage.get("datalake-dev", "mu/tpu/file.0450138") // 转换创建时间为可读格式 val creationTime = Instant.ofEpochMilli(blob.getCreateTime) println(creationTime)
方式二:使用GCS NIO文件系统提供者
如果想继续用Java NIO的API,需要引入GCS专用的NIO实现,让Paths.get能正确解析GCS路径:
- 添加依赖:
libraryDependencies += "com.google.cloud" % "google-cloud-nio" % "0.126.22"
- 调整后的代码:
import java.nio.file.{Files, Paths} import java.nio.file.attribute.BasicFileAttributes // GCS NIO提供者会自动处理gs://格式的路径,不会合并斜杠 val path = Paths.get("gs://datalake-dev/mu/tpu/file.0450138") val attrs = Files.readAttributes(path, classOf[BasicFileAttributes]) println(attrs.creationTime())
为什么原代码失效
Java NIO默认的路径处理逻辑是为本地文件系统设计的,会自动规范化路径(合并连续斜杠、处理./../等),但GCS的URI格式要求保留//来区分bucket名称和对象路径,所以必须借助GCS专用的库来处理这类路径。
内容的提问来源于stack exchange,提问作者Nouha Thabet
相关产品推荐
相关产品推荐

