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
这里非递归相对要好~
