中信笔试中遇到遍历文件夹的题目。
一、遍历所有的文件夹及子目录文件的名字。复习下IO数组
package com.test.io;
import java.io.File;
public class IO {
public static void main(String[] args) {
String path = "D:/360/360sd/Config";
bianli(path);
}
public static void bianli(String path) {
File file = new File(path);
File[] list = file.listFiles();
for (int i = 0; i < list.length; i++) {
if (list[i].isDirectory()) {
System.out.println(list[i].getName());
bianli(list[i].getPath());
} else {
System.out.println(list[i].getName());
}
}
}
}
二、输入任意目录,遍历目录及文件
package com.test.io;
import java.io.File;
import java.util.Scanner;
public class demo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入目录: ");
String next = scanner.next();
/*在windows目录复制时是\符号,无法识别,为了方便用/替换*/
String replaceAll = next.replace("\\", "/");
buanli(replaceAll);
}
public static void buanli(String string) {
File file = new File(string);
File[] listFiles = file.listFiles();
System.out.println("listFiles.length is : " + listFiles.length);
for (int i = 0; i < listFiles.length; i++) {
if (listFiles[i].isDirectory()) {
buanli(listFiles[i].getName());
}
System.out.println(listFiles[i].getName());
}
}
}
三、遍历目录下的java文件
package com.test.io;
import java.io.File;
//递归实现列出当前工程下所有.java文件
public class deme3 {
public static void main(String[] args) {
String path = "D:/腾讯/QQ/QQ消息/1371173990/FileRecv/StudentManage/src/com/test";// build\classes
buanli(path);
}
public static void buanli(String str) {
File file = new File(str);
// String[] list = file.list();
File[] list = file.listFiles();
// System.out.println(list.length);
if (list != null) {
for (int i = 0; i < list.length; i++) {
System.out.print(" I is=" + i);
if (list[i].isDirectory()) {
System.out.println(" dir:" + list[i]);
buanli(list[i].getPath());
/*
* 看api报NullPointerException 原因是使用了list[i].getName()。 应该用
* list[i].getPath() getName() 返回由此抽象路径名表示的文件或目录的名称
* getPath() 将此抽象路径名转换为一个路径名字符串。
* File一个参数构造函数的是:url或者pathname public File(String pathname)
* { if (pathname == null) { throw new
* NullPointerException(); } this.path =
* fs.normalize(pathname); this.prefixLength =
* fs.prefixLength(this.path); }
*/
}
if (list[i].getName().endsWith(".java")) {
System.out.println(" Path1 = " + list[i].getName());
}
// System.out.print(" Path2 = " + list[i].getName() + i);
}
}
}
}
四、输入两个文件夹、B,将A中的所有文件复制到B中
package com.test.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
public class demo4 {
// 输入两个文件夹名称,将A文件夹内容全部拷贝到B文件夹
//思路:目录和普通文件。1.创建文件及目录。2判断是否为文件 是则用流获取元数据的数据输出到目标文件中
static ArrayList<String> arraylist = new ArrayList();//全局变量获取需要复制的文件夹中的路径
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要复制的文件夹");
String fromdir = scanner.next();
System.out.println("复制到哪里去");
String todir = scanner.next();
File fromfile = new File(fromdir);
File tofile = new File(todir);
buanli(fromdir);
arraylist(arraylist, fromdir, todir);
// createFile("D:/IOO");
}
//遍历元文件夹,将文件目录累计到全局数组中
public static void buanli(String string) {
File file = new File(string);
File[] listFiles = file.listFiles();
// ArrayList<String> arraylist = new ArrayList<String>();
// System.out.println(listFiles[0].isDirectory());
// System.out.println("listFiles.length is : " + listFiles.length);
for (int i = 0; i < listFiles.length; i++) {
// System.out.println(listFiles[i].getName());
System.out.println(listFiles[i].getPath());
arraylist.add(listFiles[i].getPath());
if (listFiles[i].isDirectory()) {
buanli(listFiles[i].getPath());
// System.out.println(listFiles[i]);
}
// System.out.println(listFiles[i].getName());
}
}
//1遍历全局数组 2 替换\ 为/ 3判断是否是目录,不是则复制
public static void arraylist(ArrayList<String> arraylist, String fromfile, String toFile) {
for (int i = 0; i < arraylist.size(); i++) {
// System.out.println("1");
// System.out.println("创建文件或目录:" + arraylist.get(i));
System.out.println("创建文件或目录:" + arraylist.get(i).replace(fromfile, toFile));
createFile(arraylist.get(i), arraylist.get(i).replace(fromfile, toFile));
// copy(arraylist.get(i), arraylist.get(i).replace(fromfile,
// toFile));
if (new File(arraylist.get(i)).isFile()) {
copy(arraylist.get(i), arraylist.get(i).replace(fromfile, toFile));
}
}
}
//引用修改
public static void copy(String fromFile, String toFile) {
File file = new File(fromFile);
File File2 = new File(toFile);
// 定义一个输入流
FileInputStream fis = null;
// 定义一个输出流
FileOutputStream fos = null;
try {
// 把复制地址的File,封装后赋值给输入流对象
fis = new FileInputStream(file);
// 把目的地的File,封装后复制给输出流的对象
fos = new FileOutputStream(File2);
// 创建一个容量,
byte[] buf = new byte[1024];
// 每次读取/写入的字节长度
int len = 0;
// 边读边写
while ((len = fis.read(buf)) != -1) {// 判断是否还能读到数据
// 把输入放到输出流里面
fos.write(buf, 0, len);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭输入流和输出流
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void createFile(String fromFile, String toFile) {
File frfile = new File(fromFile);
File tFile = new File(toFile);
if (frfile.isDirectory()) {
System.out.println("创建目录:" + toFile);
tFile.mkdirs();
} else {
try {
tFile.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}