Java 在windows中使用文件I/O遍历目录

Java 在windows中使用文件I/O遍历目录,java,windows,file,io,nullpointerexception,Java,Windows,File,Io,Nullpointerexception,我正在编写一个程序,它使用文件I/O遍历用户给定的目录,然后将这些目录添加到通用链表中。我写的程序在Ubuntu上运行得很好,但当我试图在Windows上使用它时,它就不起作用了。这是一个相当长的计划,但我认为这是有问题的部分: private Node<Item> currentNode = new Node<Item>(); public void traverse(File fileObject) { File allFiles[] = fileObjec

我正在编写一个程序,它使用文件I/O遍历用户给定的目录,然后将这些目录添加到通用链表中。我写的程序在Ubuntu上运行得很好,但当我试图在Windows上使用它时,它就不起作用了。这是一个相当长的计划,但我认为这是有问题的部分:

private Node<Item> currentNode = new Node<Item>();

public void traverse(File fileObject)
{
    File allFiles[] = fileObject.listFiles();

    for(File aFile: allFiles){
        System.out.println(aFile.getName()); /* debugging */
        recursiveTraversal(aFile); /* Line 34 */
    }
}


public void recursiveTraversal(File fileObject){
    Node<Item> newNode = new Node<Item>();
    currentNode.addChild(newNode);
    currentNode = newNode;
    if (fileObject.isDirectory()){
        newNode.setData(new Item());

        File allFiles[] = fileObject.listFiles();
        for(File aFile : allFiles){ /* This is line 48 */
            recursiveTraversal(aFile);
        }            

    }else if (fileObject.isFile()){
        newNode.setData(new Item());
    }           
    currentNode = newNode.getParent();
}
之后有很多错误与这个程序运行的SwingGUI有关,但我认为这与任何事情都无关


编辑:添加与跟踪对应的行号

遍历()和递归遍历()之间的区别有点小 对我来说很奇怪;何时使用
traverse()
?它扮演什么角色 那
recursiveTraversal()
还不能吗?当然,
traverse()
它正在处理一个目录,但是
recursiveTraversal()
已经处理了 很好

recursiveTraversal()
中有很多关于
项的摆弄,但是
因为他们在这里什么都不做,所以很难找到实用工具。:)


我猜您正在访问一个目录,由于某些原因windows不允许您查看该目录。listFiles()在本例中很可能返回null。

如果在第48行获得
NullPointerException
,则必须表示获得的
allFiles
数组为
null
。根据该方法的定义,只有在调用它的文件不是目录或发生IO错误时,才会发生这种情况。这有点奇怪,因为您确实要检查它是否是
if
中的目录。也许在操作系统级别上存在一些关于权限的访问问题

您可能希望研究使用
FileFilter
s,或者使用
java.nio.file
包中的东西。我相信后者使遍历目录更容易。

摘自的Javadoc(重点添加):

返回:一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件和目录。如果目录为空,则数组将为空。如果此抽象路径名不表示目录,或者发生I/O错误,则返回null

您将需要处理来自
listFiles()
的空返回,不幸的是,对于
java.io.File
API,无法准确地找出发生了什么错误

如果您使用的是Java 7,则可以改用该类:

private void recursiveTraversal(Path path)
throws IOException
{
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) 
    {
        for (Path entry : stream) 
        {
            //Do something with entry
            doSomething(entry);

            if (Files.isDirectory(entry))
                recursiveTraversal(entry);
        }
    }
}
private void递归遍历(路径)
抛出IOException
{
try(DirectoryStream=Files.newDirectoryStream(path))
{
for(路径条目:流)
{
//对入口做些什么
剂量测定法(条目);
if(Files.isDirectory(条目))
递归遍历(entry);
}
}
}

区别在于
newDirectoryStream()
可以抛出
IOException
(或一个子类,如
AccessDeniedException
,提供有关调用失败原因的信息。

我在Windows上尝试了类似的操作,当程序尝试遍历安全权限限制访问的目录时,程序将崩溃并返回nullPointerException

除非您需要程序添加安全/隐藏/系统文件夹,否则只需使用try-catch子句处理错误

public static void dive(File file, int level){    
    try{
        for(File x : file.listFiles())
            if(x.isDirectory() && !x.isHidden())
                dive(x);
     }catch(NullPointerException e){
        // Do nothing..
     }
 }

这将遍历所有用户目录

在执行之前创建
currentNode
对象的位置-
currentNode.addChild(newNode)
?在我的类顶部的某个地方作为全局变量。你能添加关于如何定义
currentNode
?FileTraverse.java中的第48行有什么?我在currentNode行中添加了注释,并在错误引用的行旁边添加了注释。是的,这是真的。谢谢你的建议。很抱歉我的错误de.我刚刚开始学习数据结构,我会尽快把不必要的东西拿出来。这似乎是可能的,因为该程序似乎正在为其他特定目录工作。这也会解释为什么这只是Windows上的一个问题。也许可以尝试使用提升的权限再次运行该应用程序。例如,“以管理员身份运行”。
public void recursiveTraversal(File fileObject){
    Node<Item> newNode = new Node<Item>();
    currentNode.addChild(newNode);
    currentNode = newNode;
    newNode.setData(new Item());
    if (fileObject.isDirectory()){
        File allFiles[] = fileObject.listFiles();
        for(File aFile : allFiles){
            recursiveTraversal(aFile);
        }            
    }else if (fileObject.isFile()){
        /* must do _something_ with files */
    }           
    currentNode = newNode.getParent();
}
private void recursiveTraversal(Path path)
throws IOException
{
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) 
    {
        for (Path entry : stream) 
        {
            //Do something with entry
            doSomething(entry);

            if (Files.isDirectory(entry))
                recursiveTraversal(entry);
        }
    }
}
public static void dive(File file, int level){    
    try{
        for(File x : file.listFiles())
            if(x.isDirectory() && !x.isHidden())
                dive(x);
     }catch(NullPointerException e){
        // Do nothing..
     }
 }