如何在 Java 中引用目录?
Posted
技术标签:
【中文标题】如何在 Java 中引用目录?【英文标题】:How do I refer to a directory in Java? 【发布时间】:2011-01-10 09:44:54 【问题描述】:我正在运行 Windows,我正在尝试引用一个目录。我的功能是这样开始的:
File file = new File("C:\\somedir\\report");
if (!file.exists())
file.mkdirs();
doStuffWith(file);
当我尝试调用 listFiles
时,我在 doStuffWith
函数中遇到了 NullPointerException。好吧,我查看了 C:\somedir,发现了什么 - 有一个名为“report”的文件,没有扩展名,还有一个名为“report”的目录!似乎发生的事情是file
对象指的是报告文件,而不是目录。如何确保我指的是目录而不是文件?
【问题讨论】:
你试过 File file = new File("C:\\somedir\\report\\"); (注意尾部的斜杠)。不知道这是否可行,但值得快速构建和测试。 什么样的操作系统允许这样做?我的印象是 Windows 不允许这样做。您的目录是否有可能在名称中包含一些不可见的字符(例如空格)? 我只是尝试创建一个名为“Folder”的文件夹和一个名为“Folder”的无扩展名文件,Windows 抱怨它。我正在运行 Windows XP SP3 32 位。 @crosvenir:但要小心:仅仅因为 UI (explorer.exe) 不允许它并不意味着它不受支持。 哦,是的......很好。例如 explorer.exe 不允许您创建仅以扩展名作为名称的文件(即 .cvsignore),但文件系统确实支持它。 【参考方案1】:一种方法是将对应于 "C:\somedir" 的文件对象传递给方法,并在方法内部执行 listFiles() 并遍历内容,每次检查文件名是否存在是“报告”,执行 isDirectory()。返回 true 时继续实际处理。
【讨论】:
是的,这当然是我的问题的一种解决方案。但是效率很低,有没有人知道的更好? @Kidburla:这真的有效吗?如果是这样,那么您可以查看两个 File 对象并查看差异(在最坏的情况下,您可能希望通过反射查看)。 @Kiburla 我知道这不是最好的方法......当我看到这个问题时,这恰好是我想到的第一件事......并认为它值得分享:-) 我要对这个答案表示赞同,因为这是任何人想出的最好的答案!【参考方案2】:我认为有一个 isDirectory() 方法会告诉你它是否是一个目录
--编辑
这就是我起得这么早的原因。我在本地运行了你的代码,它对我来说很好。能够创建新文件、读取目录内容等。您还想做什么?
【讨论】:
是的,这很明显...但是您如何获得实际目录的句柄?这就是重点。 再次,我担心你误读了我的问题。该代码在大多数情况下都可以工作,但我对“somedir”目录中有一个名为“report”的无扩展名文件的特定情况感兴趣。【参考方案3】:我不明白这对我来说很好用的问题:
public class MkDir
static void doStuff(File dir)
if ( dir.isDirectory() )
File[] listFiles = dir.listFiles();
for ( File f : listFiles )
System.out.println( f.getName() );
public static void main(String[] args)
File file = new File( "C:\\dev\\rep2\\rep" );
if ( !file.exists() )
file.mkdirs();
doStuff( file );
【讨论】:
恐怕你误读了我的问题。该代码在大多数情况下都可以工作,但我对“somedir”目录中有一个名为“report”的无扩展名文件的特定情况感兴趣。【参考方案4】:检查您的文件系统是否启用了区分大小写功能(注册表中的HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\ dword:ObCaseInsensitive
。)
如果是这样,您可能会被与案例相关的问题所困扰。一种检查方法:
String someName = "./nameNotUsedYet";
boolean first = new File(someName).mkdirs();
boolean second = new File(someName.toUpperCase()).mkdirs();
System.out.println("first = " + first + ", second = " + second);
如果两个mkdirs()
调用都成功,您就知道您遇到了与案例相关的并发症。如果是这样,请确保您完全正确地理解了 "C:\somedir\report"
的情况。
【讨论】:
以上是关于如何在 Java 中引用目录?的主要内容,如果未能解决你的问题,请参考以下文章