遍历指定文件夹的代码,大家也把自己贴上来吧,希望前辈们也进来指点一下,我想学习学习,提建议的,贴代码的都有分。
/**
* @(#)Test.java 1.0 2007-07-31
* @author Yuan
* @version 1.0
* JDK version used 1.6.0
* */
package com.sqxy.tools;
import java.io.File;
import java.util.List;
import java.util.ArrayList;
/**
* FileTool
* */
public class FileTool {
//List <File> directoryList is used to save all directories.
private List <File> directoryList = new ArrayList <File> ();
//List <File> fileList is used to save all files.
private List <File> fileList = new ArrayList <File> ();
/**
* @return the list of all directories in the directory.
* */
public List <File> getDirectoryList() {
return directoryList;
}
/**
* @return the list of all files in the directory.
* */
public List <File> getFileList() {
return fileList;
}
/**
* If the File appointed is file,
* then print its attributes.
*
* If the File appointed is directory,
* then traverse the appointed,
* add all directories and files in the directory to their own list.
*
* @param name the name of the file or path.
* */
public void loadFile(String name)
{
//isBeginning用于标记是否是第一次循环
boolean isBeginning = true;
File file = new File(name);
if (file.isDirectory())
{
for (int i = 0; i <directoryList.size()
||isBeginning; ){ //第一次循环时directoryList为空
File[] files = file.listFiles();
if (isBeginning){ //第一次循环是遍历根目录,i不自加。
isBeginning = false; //第一次循环结束
}
if (directoryList.size() > 0){
file = directoryList.get(i);
i++;
}
if (file.isDirectory()
&& files!=null //防NTFS格式分区的System Volume Information文件夹造成的I/O错误
&& files.length != 0){
for (File tempFile : files){
if (tempFile.isDirectory()){
directoryList.add(tempFile);
} else if (tempFile.isFile()){
fileList.add(tempFile);
}
}
}
}
} else if (file.isFile()) {
System.out.println(file.getName());
System.out.println( "是个文件 ");
System.out.println(file.canRead() ? "可读 " : "不可读 ");
System.out.println(file.canWrite() ? "可写 " : "不可写 ");
} else {
System.out.println( "非法的文件名或路径! ");
}
}
//main方法
public static void main(String[] args)
{
long startTimeMillis = System.currentTimeMillis();
long endTimeMillis;
FileTool test = new FileTool();
test.loadFile(args[0]);
for(File directory:test.getDirectoryList())
{
System.out.println( "[ "+directory.getAbsolutePath()+ "] ");
}
for(File file:test.getFileList())
{
System.out.println(file.getAbsoluteFile());
}
endTimeMillis = System.currentTimeMillis();
System.out.println( "耗时: " + (startTimeMillis - endTimeMillis)/1000.0+ "秒 ");
System.out.println( "文件夹总数: " + test.directoryList.size());
System.out.println( "文件总数: " + test.fileList.size());
}
}
感觉自己写得太长了,而且写这段代码就花了我3小时,唉。。
分数我看着给,我是个菜鸟,给多少只代表我自己的观点,希望大家不要介意分数。
[解决办法]
递归的方法可以吗:) 不到10行代码解决
public void showDirectory(File srcDir) throws IOException {
if (srcDir.isDirectory()) {
System.out.println( "老子是文件夹,看看下面有什么~~ ");
String[] children = srcDir.list();
for (int i=0; i <children.length; i++) {
//递归
showDirectory(new File(srcDir, children[i]));
}
} else {
System.out.println( "老子是个文件而已~~ ");
}
}
[解决办法]
jf
[解决办法]
递归--> 深度优先搜索
非递归--> 广度优先搜索
[解决办法]
public static boolean listFiles(File f) {
if(!f.isDirectory()) {
return false;
}
f.listFiles(new FileFilter() {
public boolean accept(File f1) {
return listFiles(f1);
}
});
}
[解决办法]
我来接分
哈哈
[解决办法]
学习~~~~~~~~~~~~~
[解决办法]
建议散分
[解决办法]
UP
[解决办法]
import java.io.File;
import java.util.Scanner;
public class Tree {
public static void main(String[] args) {
String path = readPath();
File file = new File(path);
if(file.exists()){
output(file, 0);
}else{
System.out.print( " *** ");
System.out.print(path + " 不存在!!! ");
System.out.println( " *** ");
}
}
private static String readPath(){
Scanner scanner = new Scanner(System.in);
System.out.print( "请输入文件夹(目录)路径: ");
String path = scanner.nextLine();
return path;
}
private static void output(File file, int k){
for(int i=0; i <k; i++){
System.out.print( " ");
}
System.out.println(file.getName());
if(file.isDirectory()){
File[] files = file.listFiles();
for(File f : files){
output(f, k+1);
}
}
}
}
可以遍历输出,每进一层采用缩进两个空格处理。
[解决办法]
我把楼上的代码改了一下 想做成树状的 做不出来。。
private static void output(File file, int k) {
for (int i = 0; i < k; i++) {
System.out.print( " ");
}
if (k != 0) {
System.out.print( "|-- ");
}
System.out.println(file.getName());
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
output(f, k + 1);
}
}
}
[解决办法]
大家可以参考 apache commons io,的org.apache.commons.io.FileUtils
TO LZ:
System.out.println( "耗时: " + (startTimeMillis - endTimeMillis)/1000.0+ "秒 ");
System.out.println( "文件夹总数: " + test.directoryList.size());
System.out.println( "文件总数: " + test.fileList.size());
貌似这个测试不能连续反复进行,因为Windows会对目录的遍历结果进行缓存。你可以找一个有1w个以上文件的大文件夹,右键点击属性,可以看到第一次看到大小、个数很慢,一个个在遍历,第二次则很快。
[解决办法]
试试我的这个
import java.io.*;
import java.util.LinkedList;
import java.util.List;
public class FileHeap
{
public static void main(String[] args){
LinkedList <File> list=new LinkedList <File> ();
File dir=new File( "D:\\ ");
File file[]=dir.listFiles();
for(int i=0;i <file.length;i++){
if(file[i].isDirectory())
list.add(file[i]);
else
System.out.println(file[i].getAbsolutePath());
}
File tmp;
while(!list.isEmpty()){
tmp=list.removeFirst();
if(tmp.isDirectory()){
file=tmp.listFiles();
if(file==null)continue;
for(int i=0;i <file.length;i++){
if(file[i].isDirectory())
list.add(file[i]);
else
System.out.println(file[i].getAbsolutePath());
}
}else{
System.out.println(tmp.getAbsolutePath());
}
}
}
}