java.io.File中的绝对路径和相对路径.

本文详细解析了Java中File类使用相对路径和绝对路径的工作原理。通过实例演示了相对路径依据当前用户目录(由系统属性user.dir指定)的具体含义,并介绍了在不同环境下(如Eclipse、Tomcat)这一路径的变化。

转自http://lanmh.iteye.com/blog/515166

File 类是用来构造文件或文件夹的类 , 在其构造函数中要求传入一个 String 类型的参数 , 用于指示文件所在的路径 . 以前一直使用绝对路径作为参数 , 其实这里也可以使用相对路径 . 使用绝对路径不用说 , 很容易就能定位到文件 , 那么使用了相对路径 jvm 如何定位文件的呢 ?

按照 jdk Doc 上的说法 绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释 。默认情况下, java.io   包中的类总是根据当前用户目录 来分析相对路径名。此目录由系统属性   user.dir   指定,通常是  Java  虚拟机的调用目录 .

相对路径顾名思义 , 相对于某个路径 , 那么究竟相对于什么路径我们必须弄明白 . 按照上面 jdk 文档上讲的这个路径是 当前用户目录 也就是 java 虚拟机的调用目录 . 更明白的说这个路径其实是我们在哪里调用 jvm 的路径 . 举个例子 :

假设有一 java 源文件 Example.javad 盘根目录下 , 该文件不含 package 信息 . 我们进入命令行窗口 , 然后使用 d: 命令切换到 d 盘根目录下 , 然后用 javac Example.java 来编译此文件 , 编译无错后 , 会在 d 盘根目录下自动生成 Example.class 文件 . 我们在调用 java Example 来运行该程序 . 此时我们已经启动了一个 jvm, 这个 jvm 是在 d 盘根目录下被启动的 , 所以此 jvm 所加载的程序中 File 类的相对路径也就是相对这个路径的 ,d 盘根目录 :D:/. 同时   当前用户目录 也是 D:/.System.getProperty( user.dir ); 系统变量 user.dir 存放的也是这个值 .

我们可以多做几次试验 , Example.class 移动到不同路径下 , 同时在那些路径下 , 执行 java Example 命令启动 jvm, 我们会发现这个 当前用户目录 是不断变化的 , 它的路径始终和我们在哪启动 jvm 的路径是一致的 .

搞清了这些 , 我们可以使用相对路径来创建文件 , 例如 :

File file = new File( a.txt );

File.createNewFile();

假设 jvm 是在 D:/ 下启动的 , 那么 a.txt 就会生成在 D:/a.txt;

此外 , 这个参数还可以使用一些常用的路径表示方法 , 例如 . ./ 代表当前目录 , 这个目录也就是 jvm 启动路径 . 所以如下代码能得到当前目录完整路径 :

File f = new File(“.”);

String absolutePath = f.getAbsolutePath();

System.out.println(absolutePath);//D:/

最后要说说在 eclipse 中的情况 :

Eclipse 中启动 jvm 都是在项目根路径上启动的 . 比如有个项目名为 blog, 其完整路径为 :D:/work/IDE/workspace/blog. 那么这个路径就是 jvm 的启动路径了 . 所以以上代码如果在 eclipse 里运行 , 则输出结果为 ” D:/work/IDE/workspace/blog.”

Tomcat 中的情况 .

如果在 tomcat 中运行 web 应用 , 此时 , 如果我们在某个类中使用如下代码 :

File f = new File(“.”);

String absolutePath = f.getAbsolutePath();

System.out.println(absolutePath);

那么输出的将是 tomcat 下的 bin 目录 . 我的机器就是  D:/work/server/jakarta-tomcat-5.0.28/bin/. ”, 由此可以看出 tomcat 服务器是在 bin 目录下启动 jvm. 其实是在 bin 目录下的   catalina.bat” 文件中启动 jvm.

在处理 Scala 或 Java 代码时,如果使用 `java.io.File` 来访问 DBFS(Databricks File System)路径,会遇到 `java.io.IOException` 错误,因为 `java.io.File` 并不支持 DBFS 这类分布式文件系统路径。DBFS 是 Databricks 提供的虚拟文件系统抽象,底层实际可能指向云存储(如 AWS S3、Azure Blob Storage 等),而 `java.io.File` 仅适用于本地文件系统路径。 ### 解决方案 要修复该问题,应使用 Databricks 提供的 `dbutils` 工具或 Apache Spark 的 `SparkSession` 来访问 DBFS 路径,而不是依赖 `java.io.File`。以下是几种可行的替代方法: #### 方法一:使用 `dbutils.fs` 操作 DBFS 路径 Databricks 提供了 `dbutils.fs` API 来操作 DBFS 中的文件目录,例如: ```scala dbutils.fs.mkdirs("dbfs:/path/to/dir") dbutils.fs.put("dbfs:/path/to/file.txt", "content", true) ``` 该方式可以避免因使用 `java.io.File` 而导致的路径识别问题 [^1]。 #### 方法二:使用 Spark 的 `SparkSession` 读写 DBFS 文件 通过 Spark 的 `read` `write` 接口访问 DBFS 路径: ```scala val df = spark.read.text("dbfs:/path/to/file.txt") df.write.text("dbfs:/path/to/output.txt") ``` 这种方法利用了 Spark 内置的文件系统抽象,能够正确识别 DBFS 路径。 #### 方法三:使用 Hadoop 配置访问 DBFS 如果需要在低层级代码中访问 DBFS,可以使用 Hadoop 的 `Configuration` `FileSystem` 类: ```scala import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs._ val conf = new Configuration() val fs = FileSystem.get(new URI("dbfs:/"), conf) val path = new Path("dbfs:/path/to/file.txt") if (!fs.exists(path)) { fs.create(path) } ``` 该方式通过 Hadoop 文件系统接口访问 DBFS,避免了 `java.io.File` 的局限性。 ### 注意事项 - `java.io.File` 不适用于分布式文件系统路径,如 `dbfs://`、`s3a://`、`wasb://` 等。 - 在 Databricks 环境中,建议优先使用 `dbutils.fs` 或 Spark 的文件读写接口处理 DBFS 路径。 - 若需兼容本地文件系统 DBFS,可封装路径处理逻辑,根据路径前缀(如 `dbfs://`)动态选择访问方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值