发个帖子,问个问题.........

justinavril 2008-11-02 10:11:55
今天看见一个人在问一个问题,我就自己想当然的去试了试,请看代码:
import java.io.*;

public class ReturnFilePath {
public static void main(String args[]){
File f = new File("cstrike.exe");

if (f.exists())
System.out.println(f.getAbsolutePath().toString());

System.out.println(f.getAbsolutePath().toString());
}
}

注意上面的代码中cstrike.exe只是文件名,而没有具体的文件路径,奇怪的情况是第一句没有输出,当然了,不知道这个cstrike.exe是个啥玩意儿,但是第二句却有输出:
C:\Java-Justin\DS\cstrike.exe

C:\Java-Justin\DS\是我当前的工作目录,这不就自相矛盾吗?真实的路径是:D:\Games\Cs1.5\cstrike.exe。

然后我去看看了File类的源码:
public String getAbsolutePath() {
return fs.resolve(this);
}

fs是FileSystem的一个实例,FileSystem在j2se的API文档中没有查到,但是在源码中写到:The FileSystem object representing the platform's local file system.就是说FileSystem的对象代表了平台的当前文件系统。但是感觉这个没有起作用啊?

大家来帮我看看吧 呵呵
...全文
297 47 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
E9427615058 2008-11-08
  • 打赏
  • 举报
回复
学习...
shuaiAWP 2008-11-08
  • 打赏
  • 举报
回复
飘过
java越学越心惊
woshy1024 2008-11-04
  • 打赏
  • 举报
回复
同16楼。
getter 2008-11-04
  • 打赏
  • 举报
回复
api中也說了自己是abstract file...
getter 2008-11-04
  • 打赏
  • 举报
回复
樓主並沒有理解類File
File類只是一個抽像的文件,包了一些方法,總比你用string要好
你創建一個File類對象,並不是代表你在文件系統上創建了一個實際的文件,只是在內存中建了一個抽象文件,而此文件可能對應於文件系統上的實際文件,也可能只是一個只存在於內存的邏輯文件(在乎於你是否有進行如BufferedOutputStream.write之類的工作...我表達能力不好,總之意思就是紅色那句)

import java.io.*;

public class ReturnFilePath {
public static void main(String args[]){
File f = new File("cstrike.exe");

if (f.exists())
System.out.println(f.getAbsolutePath().toString());

System.out.println(f.getAbsolutePath().toString());
}
}


代碼紅色那句,你自己明顯寫的是相對路徑,故如樓上所說,最後一句打印的是System.getProperty("user.dir") + 你的cstrike.exe,這句是完全沒有疑問的,而if句因為你實際路徑沒有這個文件,故不成立,也是沒有疑問的...
風男 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 justinavril 的帖子:]

File f = new File("cstrike.exe");
C:\Java-Justin\DS\是我当前的工作目录,这不就自相矛盾吗?真实的路径是:D:\Games\Cs1.5\cstrike.exe。

[/Quote]

晕倒,这样的问题这么多人回了还没结果
认真看引用楼主的两句话!!
File f = new File("cstrike.exe");//当然是工作目录下查找,除非你将 D:\Games\Cs1.5\ 加到 classpath 中

至于为什么输入 C:\Java-Justin\DS\cstrike.exe
那是因为 new File("cstrike.exe");//在工作目录下声明一个文件
注意:这个文件并没有正式创建,所有目录下这个文件是不存在的
KOOK_OKKO 2008-11-04
  • 打赏
  • 举报
回复

//这样看来的话调用f.getAbsolutePath()方法,如果
//找不到f的路径,它会在项目的跟目录下自己建立一个目录
非典型射手 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 justinavril 的回复:]
引用 31 楼 bruni 的回复:
引用 29 楼 justinavril 的回复:
引用 28 楼 java2000_net 的回复:

File f = new File("cstrike.exe");


这个对应于系统运行根目录,也就是你的C:\Java-Justin\DS\

这个和你的exe没有关系,你可以随便写一个,比如

File f = new File("cstrik反对萨芬多年来萨芬e.exe");

你打印出来看看就知道了

但是如果File f = new File("D:\\cstrike.exe");的话,打印出来的就是D:\\cs…

不是绝对路径和相对路径的事儿
[/Quote]

那你觉得又是什么原因呢?
wonflay 2008-11-04
  • 打赏
  • 举报
回复
if (f.exists())
     {
System.out.println(f.getAbsolutePath().toString());

   System.out.println(f.getAbsolutePath().toString());
     }
scarlet365 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 huoyin 的回复:]
File f = new File("cstrike.exe");

系统在执行上面的那个语句时,会把cstrike.exe转换为一个标准的绝对路径,因为这个cstrike.exe是一个相对路径,所以系统会为他加上当前目录System.getProperty("user.dir")

所以你打印出来的路径是:
C:\Java-Justin\DS\cstrike.exe

你在执行前可以将当前目录换掉,这样打印出来的getAbsolutePath也会不同
[/Quote]

我认为这个是正确的.
KingZChina 2008-11-04
  • 打赏
  • 举报
回复
挺热闹 但是我插不上最 着急啊 ! 因为我看不懂啊 还需努力
pauliuyou 2008-11-04
  • 打赏
  • 举报
回复
文件的路径问题.
没有绝对路径的文件名,会理解为当前目录下的文件,如果有了绝对路径,那就太好了.直接定位.

你的例子中是相对路径,会认为是在当前目录下. 而实际上这个文件并不存在,所以第一句打印不出来.

而第二句能打印出来,是表明这个file对象具备了在当前目录下创建这个相对文件的能力,
如果你调用f.createFile(),文件就真的创建出来了,而它的绝对路径就是当前目录+相对路径.

huoyin 2008-11-03
  • 打赏
  • 举报
回复
jvm可以识别出一个路径是绝对路径或者是相对路径的
D:\\cstrike.exe 是一个绝对路径

cstrike.exe 是一个相对路径


import java.io.File;

public class Test {
public static void main(String args[]) throws Exception {
System.out.println(new File("cstrike.exe").isAbsolute());
System.out.println(new File("d:\\cstrike.exe").isAbsolute());
}
}


上面的代码输出:第一个是false,第二个是true。

JVM会对相对路径进行扩展的,如果你只写cstrike.exe,他自动会被扩展为System.getProperty("user.dir") + "\\" + cstrike.exe

d:\cstrike.exe本身就是一个绝对路径,所以不用扩展。
justinavril 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 bruni 的回复:]
引用 29 楼 justinavril 的回复:
引用 28 楼 java2000_net 的回复:

File f = new File("cstrike.exe");


这个对应于系统运行根目录,也就是你的C:\Java-Justin\DS\

这个和你的exe没有关系,你可以随便写一个,比如

File f = new File("cstrik反对萨芬多年来萨芬e.exe");

你打印出来看看就知道了

但是如果File f = new File("D:\\cstrike.exe");的话,打印出来的就是D:\\cstrike.exe

这有什么原因啊…
[/Quote]
不是绝对路径和相对路径的事儿
justinavril 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cydp007 的回复:]
我遇到一个瓶颈.. 小猴子..


你知不知道 哪个类继承了 FileSystem这个类. 对你这个问题相当重要.
[/Quote]
我也不知道啊 我在api里也没查到关于FileSystem的任何信息 估计这个类是供JVM调用的吧 我也疑惑呢 在源码里看到 我昨晚要睡觉了 就没继续查了 然后就发了这个帖子
justinavril 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 huoyin 的回复:]
JDK的File类貌似有一个小的Bug如下:


Java code
import java.io.*;

public class ReturnFilePath {
public static void main(String args[]){
     System.setProperty("user.dir","D:\\Games\\Cs1.5"); //加上这个,这是你的路径名应当没有问题了,你可以检查f.getAbsolutePath()的输出就知道了,但是f.exists()的值还是false,很奇怪
File f = new File("cstrike.exe");

if …
[/Quote]
我的意思估计大家有点不明白 但是你在前面解释的我觉得有道理

我本意是想验证一下那个getAbsolutePath()方法的 我是知道cstrike.exe在哪儿的 我只是想验证
lisl2003 2008-11-03
  • 打赏
  • 举报
回复
每天进步一点点
justinavril 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bao110908 的回复:]
怎么可能会输出 D:\Games\Cs1.5\cstrike.exe 这个路径呢,代码中的文件名只是个抽象的文件名,
D:\Games\Cs1.5 这个目录跟 Java 运行的目录是风马牛不相及的,根本不可能会输出这个的啊。

File 只是文件抽象形式,并不需要这个文件存在的。使用 getAbsolutePath 或者 getCanonicalPath
输出的表示这个抽象形式的文件绝对或者规范路径的位置。
[/Quote]
实际就是输出这个的 果子 你可以去看看 我自己run过了
bruni 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 justinavril 的回复:]
引用 28 楼 java2000_net 的回复:

File f = new File("cstrike.exe");


这个对应于系统运行根目录,也就是你的C:\Java-Justin\DS\

这个和你的exe没有关系,你可以随便写一个,比如

File f = new File("cstrik反对萨芬多年来萨芬e.exe");

你打印出来看看就知道了

但是如果File f = new File("D:\\cstrike.exe");的话,打印出来的就是D:\\cstrike.exe

这有什么原因啊  比较奇怪啊
[/Quote]

一个是绝对路径
一个是相对路径
justinavril 2008-11-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gmh521 的回复:]
如果不加的话第一个输出肯定没有啊,因为不存在。第二个输出的作用范围是全局的不在if下,File f = new File("cstrike.exe");cstrike.exe文件肯定在当前目录下啊所以输出C:\Java-Justin\DS\cstrike.exe你的当前目录
[/Quote]
你没看懂我的意思 谢谢
加载更多回复(26)

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧