如何在 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 中引用目录?的主要内容,如果未能解决你的问题,请参考以下文章

java如何将引用了第三方模块的A项目打包成jar包后,在B项目中引用A项目打包成的jar包?

Java 如何有效地避免OOM:善于利用软引用和弱引用

java引用

如何在 Java 中使用引用?

java 如何引入 jar包?

执行 java.io.File 或 FileInputStream 时如何引用 OSGi 包中包含的文件