分享下通过java 读取目录及子目录下指定文件名的路径 并放到一个List数组里面返回遍历和写到文件里(同时将不会出现覆盖问题和重复读入问题)

import java.io.*;

import java.util.Scanner;

public class ListFiles01
{
private static String listFileStr;
static int ch;
static Scanner sc = new Scanner(System.in);

public static void main(String[] args)
{
Delete();//调用方法
//删除操作,目的是防止重复录入和检查文件是否存在
System.out.print("开始录入: ");
System.out.println("————————");
try
{
File file = new File(args[1]);
//在命令行参数中输入文件名
FileWriter fw = new FileWriter(file);
//实例化一个FileWriter变量
ListFiles01 lf = new ListFiles01();
lf.listFile(args[0]);
//将地址名传入,并且调用方法

//在命令行参数中输入地址
fw.write(listFileStr);
fw.close();

} catch (ArrayIndexOutOfBoundsException e)
{
// 参数提示
System.out.println("No 'source dir' or 'target file' ");
//如果在命令行参数中没有写入两个名称,即地址和文件名
//不存在地址或者文件名
} catch (IOException e)
{
System.out.println("IO error! " + e.toString());
}
}

private static void Delete()//静态方法
{
File file = new File("Output.doc");//文件名称
if (file.exists())
{
System.out.println("该文件存在");
file.delete();//删除操作
} else
{
System.out.println("该文件不存在,新建...");
try
{
file.createNewFile();//文件新建操作
} catch (IOException e)
{
e.printStackTrace();
}
}
}

private int i;

public void listFile(String str) throws IOException//含有String形参
{
File file = new File(str);
File list[] = file.listFiles();
for (i = 0; i < list.length; i++)//循环,重复读入
{
if (list[i].isDirectory())// 判断是否为文件夹
{
// System.out.println(list[i]
// .getPath()); // 输出文件夹名称
// listFile(list[i].getPath());
//继续向该文件夹目录下面深入
//并且new一个新的对象、调用方法、继续判断
new ListFiles01().listFile(list[i].toString());// 递归
} else
{
listFileStr = list[i].getAbsolutePath() + " ";//隔行
System.out.println(list[i].getAbsolutePath());//输出文件名称
byte[] buffer = listFileStr.getBytes();
//通过字节数组来将控制台中写入的数据再次读入文件夹中
if (buffer != null)
{
FileOutputStream outputStream = new FileOutputStream(
"Output.doc", true);
//定义FileOutputStream对象时增加了一个参数true
//用于一行一行写入,防止覆盖上一行的内容
outputStream.write(buffer);
outputStream.close();
}
}
}
}
}

/*以上为从命令行读入,还有就是下方的从控制台输入,相比而言,控制台输入更加方便*/

import java.io.*;
import java.util.Scanner;

public class ListFiles02
{
private static final String list = null;
private static String str = null;
private static String listFileStr;
static int ch;
static Scanner sc = new Scanner(System.in);

public static void main(String[] args)
{
Delete();
System.out.println("输入你选择的地址: ");
System.out.print("——————");
try
{
FileWriter fw = new FileWriter("outputstream.doc", true);
ListFiles02 lf = new ListFiles02();
// 输入路径
Scanner sc = new Scanner(System.in);
str = sc.nextLine();
lf.listFile(str);
fw.write(listFileStr);
fw.close();

} catch (ArrayIndexOutOfBoundsException e)
{
// 参数提示
System.out.println("No 'source dir' or 'target file' ");

} catch (IOException e)
{
System.out.println("IO error! " + e.toString());
}
}

private static void Delete()
{
File file = new File("outputstream.doc");
if (file.exists())
{
System.out.println("该文件存在");
file.delete();
} else
{
System.out.println("该文件不存在,新建...");
try
{
file.createNewFile();
} catch (IOException e)
{
e.printStackTrace();
}
}
}

private int i;

public void listFile(String str) throws IOException
{
File file = new File(str);
File list[] = file.listFiles();
for (i = 0; i < list.length; i++)
{

if (list[i].isDirectory())
{
// // 判断是否为文件夹
// System.out.println(list[i]
// .getPath()); // 输出文件夹名称
// listFile(list[i].getPath());
new ListFiles02().listFile(list[i].toString());// 递归
} else
{
listFileStr = list[i].getAbsolutePath() + " ";
System.out.println(list[i].getAbsolutePath());
byte[] buffer = listFileStr.getBytes();
if (buffer != null)
{
FileOutputStream outputStream = new FileOutputStream(
"outputstream.doc", true);
outputStream.write(buffer);
outputStream.close();
}
}
}
}
}