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