Java文件操作之按行读取文件和遍历目录的方法
按行读取文件
packagetest; importjava.io.*; importjava.util.*; publicclassReadTest{ publicstaticList<String>first_list; publicstaticList<String>second_list; publicReadTest(){ first_list=newLinkedList<>(); second_list=newLinkedList<>(); } publicstaticvoidReadFile(){ finalStringfilename="d://aa.txt"; Stringstr=null; inti=0; try{ LineNumberReaderreader=null; reader=newLineNumberReader(newFileReader(filename)); while((str=reader.readLine())!=null){ if(!str.isEmpty()){ Stringvalues[]=str.split(""); first_list.add(values[0]); second_list.add(values[1]); } } }catch(IOExceptione){ e.printStackTrace(); } } publicstaticvoidmain(Stringargs[]){ ReadTestreader=newReadTest(); reader.ReadFile(); for(inti=0;i<first_list.size();i++){ System.out.println(first_list.get(i)+":"+second_list.get(i)); } } }
递归遍历目录
classListFiles{ publicstaticArrayListfilelist=newArrayList(); publicstaticvoidlistfiles(Stringdir){ Filefile=newFile(dir); File[]files=file.listFiles(); if(null==files){ return; } for(inti=0;i<files.length;i++){ if(files[i].isDirectory()) { listfiles(files[i].getAbsolutePath()); } else{ System.out.println(files[i]); filelist.add(files[i]); } } } }
上面遍历目录是一种递归的方法,我们再来看一下非递归的实现:
//非递归 publicstaticvoidscanDirNoRecursion(Stringpath){ LinkedListlist=newLinkedList(); Filedir=newFile(path); Filefile[]=dir.listFiles(); for(inti=0;i<file.length;i++){ if(file[i].isDirectory()) list.add(file[i]); else{ System.out.println(file[i].getAbsolutePath()); num++; } } Filetmp; while(!list.isEmpty()){ tmp=(File)list.removeFirst();//首个目录 if(tmp.isDirectory()){ file=tmp.listFiles(); if(file==null) continue; for(inti=0;i<file.length;i++){ if(file[i].isDirectory()) list.add(file[i]);//目录则加入目录列表,关键 else{ System.out.println(file[i]); num++; } } }else{ System.out.println(tmp); num++; } } }
我们可以写一个类来简单测试一下:
importjava.io.File; importjava.util.LinkedList; publicclassFileSystem{ publicstaticintnum; publicstaticvoidmain(String[]args){ longa=System.currentTimeMillis(); //Stringpath="c:"; num=0; String[]lists={"c:","d:"}; /* for(inti=0;i<lists.length;i++){ Filefile=newFile(lists[i]); scanDirRecursion(file); */ for(inti=0;i<lists.length;i++){ scanDirNoRecursion(lists[i]); } System.out.print("文件总数:"+num); System.out.print("总耗时:"); System.out.println(System.currentTimeMillis()-a); }
测试结果:
递归:
文件总数:189497 总耗时:39328
非递归:
文件总数:189432总耗时:37469
这里非递归相对要好~