1、参数是File,删除文件或者目录
/** * 删除文件, 删除当前目录即里面的所有文件(利用递归) * * @param file * 文件或者目录 */
public static boolean deleteFileDir(File fileOrDir) {
// 1、先判断文件是否存在
if (!fileOrDir.exists()) {
return false;
}
// 2、如果是文件则直接删除
if (fileOrDir.isFile()) {
if (fileOrDir.delete()) {
return false;
}
// 3、如果是目录,递归删除
} else if (fileOrDir.isDirectory()) {
// listFiles() 返回一个抽象路径名数组,存放文件的绝对路径
File[] files = fileOrDir.listFiles();
if (files == null) {
return false;
}
// 递归删除子目录
for (File oneFile : files) {
if (deleteFileDir(oneFile)) {
return false;
}
}
// 删除目录失败,或者删除当前目录失败
return fileOrDir.delete();
}
return true;
}
2、参数是String类型, 删除单个文件,删除当前目录及里面所有文件
/** * 删除单个文件,删除当前目录及里面所有文件 * * @param filePath * 文件的路径 * @return 删除成功返回true */
public static boolean deleteFileDir(String fileOrDirPath) {
File fileOrDir = new File(fileOrDirPath);
if (fileOrDir.isFile()) {
//这里不用考虑文件的异常情况,在deleteFileDir里已经分析过
return deleteFileDir(fileOrDir);
} else
return fileOrDir.isDirectory() && deleteFileDir(fileOrDir);
}
======
先了解如何创建单个文件
/** * 创建单个文件及其父目录 * * @param filePath * 要创建文件的路径 * @return 文件存在或者创建文件成功返回true */
public static boolean createFile(String filePath) {
File file = new File(filePath);
if (file.exists() && file.isFile()) {
return true;
}
// 创建文件的目录结构
if (!file.getParentFile().exists()) {
if (!file.getParentFile().mkdirs()) {
return false;
}
}
try {
//创建文件
return file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
复制单个文件,采用的字节缓冲流,可以复制任何形式的文件,如图片,视频
/** * 利用缓冲流对文件进行复制 * * @param sourceFilePath * 准备复制的文件路径 * @param copyFilePath * 复制后的文件路径 */
public static boolean copyFile(String sourceFilePath, String copyFilePath) {
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
File sourceFile = new File(sourceFilePath);
if (!sourceFile.exists() || !sourceFile.isFile()) {
return false;
}
try {
bufferedInputStream = new BufferedInputStream(new FileInputStream(sourceFile));
if (!createFile(copyFilePath)) {
return false;
}
int len;
byte[] buffer = new byte[1024 * 10];
// 必须放在createFile(copyFilePath)的文件创建好的后面,,不然出异常,因为copyPath对应的文件可能没有
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File(copyFilePath)));
while ((len = bufferedInputStream.read(buffer)) != -1) {
bufferedOutputStream.write(buffer, 0, len);
}
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
// 关闭输入输出流
if (null != bufferedOutputStream) {
try {
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != bufferedInputStream) {
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
利用栈复制目录,也需要用到上面的单个文件复制的文件
/** * 利用栈复制目录 * * @param sourDirPath 准备复制的目录的绝对路径 * @param targetDirPath 复制后的文件绝对路径 */
public static boolean copyDirectory(final String sourDirPath, final String targetDirPath) {
final Stack<String> dirStack = new Stack<String>();
//主要是为了获取目录结构长度,便于后面获取其目录下的目录结构
final int sourDirLength = sourDirPath.split("/|\\\\").length;
File dirOrFile = new File(sourDirPath);
if (!dirOrFile.isDirectory() && !dirOrFile.exists()) {
return false;
}
//进栈
dirStack.push(sourDirPath);
while (dirStack.size() > 0) {
//每次出栈都是一个目录
File directory = new File(dirStack.pop());
// FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件
directory.listFiles(new FilenameFilter() {
// dir表示文件的当前目录,name表示当前目录下的文件名或目录名;
@Override
public boolean accept(File dir, String name) {
File findFile = new File(dir, name);
if (findFile.isDirectory()) {
dirStack.push(findFile.getAbsoluteFile().toString());
return false;
} else {
String targetFilePath = targetDirPath + spiltString(findFile.getAbsolutePath(), sourDirLength);
copyFile(findFile.getAbsolutePath(), targetFilePath);
}
return false;
}
});
}
return true;
}
拆分字符串并组装:用于获取相对路径
/** * 拆分字符串并组装:用于获取相对路径 * * @param string * 要拆分的字符串 * @param cutNum * 拆分时要去掉前面字符的个数 * @return 返回值是相对路径 */
private String spiltString(String string, int cutNum) {
String relativePath = "";
// 正则表达式判断是/(linux)还是\(windows)
int len = string.split("/|\\\\").length;
String[] array = new String[len - cutNum];
for (int i = cutNum, j = 0; i < len; i++, j++) {
array[j] = string.split("/|\\\\")[i];
}
for (String character : array) {
relativePath += File.separator + character;
}
return relativePath;
}
/** * 利用栈获取当前目录下(包括子目录)的所有文件 * * @param directoryPath 目录路径 * @param excelRegularExp 能判断文件是Excel文件的正则表达式 * @return 返回只有Excel文件的绝对路径的列表 */
public static List<String> enumFiles(String directoryPath) {
final Stack<String> stack = new Stack<String>();
//用来存放目录下的所有文件的集合
final List<String> allFiles = new ArrayList<String>();
File dirOrFile = new File(directoryPath);
if (!dirOrFile.isDirectory() || !dirOrFile.exists()) {
return allFiles;
} else {
stack.push(directoryPath);
while (stack.size() > 0) {
File directory = new File(stack.pop());
//FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件
directory.listFiles(new FilenameFilter() {
// dir表示文件的当前目录,name表示当前目录下的文件名或目录名;
@Override
public boolean accept(File dir, String name) {
File findFile = new File(dir, name);
if (findFile.isDirectory()) {
stack.push(findFile.getAbsoluteFile().toString());
return false;
} else {
//这里如果加name.matches(regularExp)含有正则表达式的的条件,则可以获取指定的文件
if ( findFile.isFile()) {
allFiles.add(findFile.getAbsolutePath());
}
}
return false;
}
});
}
}
return allFiles;
}
需要注意的是1、中文可能会乱码。2、新增的数据要添加在文件里数据的后面
/** * 将结果写入文件中 * * @param data * 要写入的到文件的数据 * @param filePath * 输出文件路径,即要写入的文件路径 * @return 成功返回true */
public static boolean writeToFile(String data, String filePath) {
File file = new File(filePath);
if (!file.exists() || !file.isFile()) {
try {
if (!file.createNewFile()) {
return false;
}
} catch (IOException e) {
e.printStackTrace();
}
}
BufferedWriter writer = null;
try {
// 这里的true表示新增的数据,是添加在文件数据的后面,gbk或者utf-8是防止中文乱码
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file, true), "gbk");
// 将字符串写到文件里,对应一行。\n 新行(换行)符
writer = new BufferedWriter(out);
writer.write((data + "\n"));
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
if (null != writer) {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void readTxtFile(String filePath) {
BufferedReader bufferedReader = null;
try {
File in = new File(filePath);
//解决得到的中文乱码问题
InputStreamReader read = new InputStreamReader(new FileInputStream(in),"gbk");
bufferedReader = new BufferedReader(read);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (bufferedReader != null){
bufferedReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}