11.字节流操作文件夹

//使用字节流访问一个路径下的文件夹,遍历复制含有java文件的文件夹

package com.itheima_02;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Scanner;

public class Test02_2 {

public static void main(String[] args) throws IOException {

// File src = getDir();

// File dest = getDir();

//源目录

File src = new File("D:\\workspace");

//目标目录

File dest = new File("d:\\copy");

copy(src, dest);

}

private static void copy(File src, File dest) throws IOException {

// 获取源文件夹中的所有内容(子文件夹和文件)

File[] listFiles = src.listFiles();

// 判断File数组是否为空(因为系统有些隐藏文件不能被直接访问)

if(listFiles != null){

// 遍历File数组

for (File subFile : listFiles) { // subFile表示 这个数组中(源文件)的 子文件夹和文件

if(subFile.isFile() && subFile.getName().endsWith(".java")){ // 判断这个File是否为文件并且是否以.java为后缀名结尾

// 使用IO流拷贝文件

BufferedInputStream bis = new BufferedInputStream(new FileInputStream(subFile));

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(dest, subFile.getName())));

byte[] buf = new byte[1024];

int len;

while((len = bis.read(buf)) != -1){

bos.write(buf, 0, len);

}

bos.close();

bis.close();

} else if(subFile.isDirectory()){

// 由于subFile是代表源文件夹中的子文件夹,而目的地中并没有这个目录(即subFile), 所以需要现在目标文件夹中创建 这个目录

// 为啥非要在目的地中创建subFile文件夹呢? 因为,subFile文件夹中有可能有文件,而这个subFile里边的文件必须得拷贝目标文件夹中的subFile这个目录中,所以需要在目的地中创建这个subFile目录

// 若要创建文件夹,必须通过File对象

if(compare(subFile)){ // D:\\workspace\\abc

File newDir = new File(dest, subFile.getName());

if(!newDir.exists())

newDir.mkdir();

// 递归调用此方法

copy(subFile, newDir);

}

}

}

}

}

/*

* 要确定是否在目标文件夹中创建这个目录,只需要明确传递过来的文件夹中,是否有包含.java文件

* 举例:

* 判断  D:\\workspace文件夹中是否有以.java结尾的文件

* 只要D:\\workspace文件夹中当前目录有.java文件或者D:\\workspace目录的子文件夹中有.java文件,都称之为D:\\workspace文件夹中有.java文件

*/

private static boolean compare(File dir) { // D:\\workspace\\abc

// D:\\workspace\\abc\\exam0425

//  aa

//cc

//  bb

//dd

File[] listFiles = dir.listFiles(); // listFiles代表当前路径下的所有文件和文件夹

if(listFiles != null){

for (File subFile : listFiles) { // D:\\workspace\\abc\\exam0425  D:\\workspace\\abc\\RemoteSystemsTempFiles

if(subFile.isFile() && subFile.getName().endsWith(".java")){

return true;

} else if(subFile.isDirectory()){ // D:\\workspace\\abc\\exam0425

boolean flag = compare(subFile);

if(flag == false){

continue;

} else{

return flag;

}

}

}

}

return false;

}

// 键盘录入文件夹路径

private static File getDir() {

Scanner sc = new Scanner(System.in);

while(true){

System.out.println("请输入一个文件夹路径字符串:");

String line = sc.nextLine();

// 将字符串转换成File对象,因为只有File对象,才能判断这个字符串路径是否为文件夹路径。

File dir = new File(line);

// 判断这个File是否是文件夹路径

if(dir.isDirectory()){

return dir;

} else{

System.out.println("你录入的路径有误,请重新录入:");

}

/*if(dir.isDirectory()){

return dir;

} else if(dir.isFile()){

System.out.println("你录入的是文件路径,请重新录入");

} else{

System.out.println("你录入的路径有误,请重新录入:");

}*/

}

}

}

你可能感兴趣的:(11.字节流操作文件夹)