package com.zhihua.file;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.Set;
/**
* 文件操作工具类
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
public class FileUtils {
/**
* 创建目录
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param dir 目录
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void mkdir(String dir){
try{
File dirPath = new File(dir);
if(!dirPath.exists()){
dirPath.mkdirs();
}
}catch(Exception e){
System.out.println("创建目录操作失败!"+e.getMessage());
e.printStackTrace();
}
}
/**
* 新建文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param fileName 包含路径的文件名 如:E:\
* @param content 文件内容
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void createNewFile(String fileName,String content){
try{
File filePath = new File(fileName);
if(!filePath.exists()){
filePath.createNewFile();
}
FileWriter fw = new FileWriter(filePath);
PrintWriter pw = new PrintWriter(fw);
pw.println(content);
pw.flush();
pw.close();
fw.close();
}catch(Exception e){
System.out.println("新建文件操作出错!"+e.getMessage());
e.printStackTrace();
}
}
/**
* 列出某文件夹及其子文件夹下面的文件,并可根据扩展名过滤
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param fileName 完整路径的文件名
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月14日]
*/
public static void listFile(String fileName){
File file = new File(fileName);
if(!file.exists()){
System.out.println("文件不存在!");
}else{
if(file.isFile()){
if(file.getName().toLowerCase().endsWith(".pdf")
|| file.getName().toLowerCase().endsWith(".doc")
|| file.getName().toLowerCase().endsWith(".chm")
|| file.getName().toLowerCase().endsWith(".html")
|| file.getName().toLowerCase().endsWith(".htm")
|| file.getName().toLowerCase().endsWith(".ftl")){
//过滤文件格式
System.out.println(file);
System.out.println(file.getName());
}
}else{
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f.getAbsolutePath());
listFile(f.getAbsolutePath());
}
}
}
}
/**
* 删除文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param folderPath 文件夹路径
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void delFolder(String folderPath){
try{
//删除文件夹里面所有内容
delAllFile(folderPath);
File filePath = new File(folderPath);
//删除空文件夹
filePath.delete();
}catch(Exception e){
System.out.println("删除文件夹操作出错!"+e.getMessage());
e.printStackTrace();
}
}
/**
* 删除文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param fileName 包含路径的文件名
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void delFile(String fileName){
try{
File delFile = new File(fileName);
delFile.delete();
}catch(Exception e){
System.out.println("删除文件操作出错!"+e.getMessage());
e.printStackTrace();
}
}
/**
* 删除文件夹中的所有文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param path 文件夹路径
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void delAllFile(String path){
File file = new File(path);
if(!file.exists()){
return;
}
if(!file.isDirectory()){
return;
}
String[] childFiles = file.list();
File tempFile = null;
for(int i=0;i<childFiles.length;i++){
//File.separator与系统有关的默认名称分隔符
//在UNIX系统上,此字段的值为'/';在Microsoft Windows系统上,它为 '\'。
if(path.endsWith(File.separator)){
tempFile = new File(path+childFiles[i]);
}else{
tempFile = new File(path+File.separator+childFiles[i]);
}
if(tempFile.isFile()){
tempFile.delete();
}
if(tempFile.isDirectory()){
delAllFile(path+"/"+childFiles[i]);//先删除文件夹里面的文件
delFolder(path+"/"+childFiles[i]);//再删除空文件夹
}
}
}
/**
* 复制单个文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param sourceFile 包含路径的源文件
* @param targetFile 目标文件目录,如果该目标目录不存在则自动创建
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void copyFile(String sourceFile,String targetFile){
try{
FileInputStream in = new FileInputStream(sourceFile);
mkdir(targetFile);
FileOutputStream out = new FileOutputStream(targetFile+"/"+new File(sourceFile).getName());
int len;
byte[] buffer = new byte[1024];
while((len = in.read(buffer))!= -1){
out.write(buffer,0,len);
}
out.flush();
out.close();
in.close();
}catch(Exception e){
System.out.println("复制文件操作出错!"+e.getMessage());
e.printStackTrace();
}
}
/**
* 复制文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param sourceFolder 源文件夹路径
* @param newFolder 目标文件夹路径
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void copyFolder(String sourceFolder,String newFolder){
try{
//如果文件夹不存在,则新建文件夹
mkdir(newFolder);
File sourceFile = new File(sourceFolder);
String[] files = sourceFile.list();
if(files.length<=0){
System.out.println("源文件夹为空!");
return;
}
File tempFile = null;
for(int i=0;i<files.length;i++){
if(sourceFolder.endsWith(File.separator)){
tempFile = new File(sourceFolder+files[i]);
}else{
tempFile = new File(sourceFolder+File.separator+files[i]);
}
if(tempFile.isFile()){
FileInputStream input = new FileInputStream(tempFile);
FileOutputStream output = new FileOutputStream(newFolder+"/"+((tempFile.getName()).toString()));
byte[] buffer = new byte[1024*2];
int len;
while((len=input.read(buffer))!= -1){
output.write(buffer,0,len);
}
output.flush();
output.close();
input.close();
}
if(tempFile.isDirectory()){
//如果是子文件夹
copyFolder(sourceFolder+"/"+files[i],newFolder+"/"+files[i]);
}
}
}catch(Exception e){
System.out.println("复制文件夹操作出错!"+e.getMessage());
e.printStackTrace();
}
}
/**
* 移动文件到指定目录
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param sourceFile 包含路径的文件名
* @param targetFile 目标文件目录
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void moveFile(String sourceFile,String targetFile){
copyFile(sourceFile, targetFile);
delFile(sourceFile);
}
/**
* 移动文件到指定目录,不会删除文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param sourceFolder 源文件目录
* @param targetFolder 目标文件目录
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void moveFiles(String sourceFolder,String targetFolder){
copyFolder(sourceFolder, targetFolder);
delAllFile(sourceFolder);
}
/**
* 移动文件到指定目录,会删除文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param sourceFolder 源文件目录
* @param targetFolder 目标文件目录
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月5日]
*/
public static void moveFolder(String sourceFolder,String targetFolder){
copyFolder(sourceFolder, targetFolder);
delFolder(sourceFolder);
}
/**
* 读取数据
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param inStream 输入流
* @param charsetName 字符格式
* @return
* @throws Exception
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
public static String readData(InputStream inStream,String charsetName)throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = inStream.read(buffer))!=-1){
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
outStream.close();
inStream.close();
return new String(data,charsetName);
}
/**
* 一行一行读取文件,适合字符读取,若读取中文字符时会出现乱码
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @param path
* @return
* @throws Exception
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
public static Set<String> readFile(String path)throws Exception{
Set<String> datas = new HashSet<String>();
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
String line = null;
while((line=br.readLine())!=null){
datas.add(line);
}
br.close();
fr.close();
return datas;
}
}
测试类:
package com.zhihua.file.test;
import org.junit.Test;
import com.zhihua.file.FileUtils;
public class FileUtilsTest {
/**
* 创建目录
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void mkdir(){
FileUtils.mkdir("E:/mkdir/");
System.out.println("创建目录成功!");
}
/**
* 新建文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void createFile(){
try{
String content = "这是在新建文件的内容";
String path = "E:/mkdir/createNewFile.xml";
FileUtils.createNewFile(path, content);
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 遍历文件夹下所有的文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月14日]
*/
@Test
public void listFile(){
String fileName = "E:/mkdir";
FileUtils.listFile(fileName);
}
/**
* 删除文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void delFile(){
String fileName = "E:/mkdir/createNewFile.xml";
FileUtils.delFile(fileName);
System.out.println("删除文件成功!");
}
/**
* 删除文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void delFolder(){
String folderName = "E:/mkdir/del";
FileUtils.delFolder(folderName);
}
/**
* 删除文件夹里面的所有文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void delAllFile(){
String path = "E:/mkdir/del/";
FileUtils.delAllFile(path);
}
/**
* 复制文件
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void copyFile(){
//获取文件源地址
String sourceFile = "E:/mkdir/free.ftl";
//获取文件目标目录
String targetFile = "E:/mkdir/del/";
if(sourceFile==null||"".equals(sourceFile)){
System.out.println("源文件不存在!");
return;
}
FileUtils.copyFile(sourceFile, targetFile);
}
/**
* 复制文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void copyFolder(){
//获取文件源目录
String sourceFolder = "E:/mkdir/del/";
//获取文件目标目录
String targetFolder = "E:/mkdir/copy/";
FileUtils.copyFolder(sourceFolder, targetFolder);
}
/**
* 移动文件到指定目录
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void moveFile(){
String sourceFile = "E:/mkdir/del/login.wav";
String targetFile = "E:/mkdir/move/";
FileUtils.moveFile(sourceFile, targetFile);
}
/**
* 移动多个文件到指定目录,不会删除文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void moveFiles(){
String sourceFolder = "E:/mkdir/copy/";
String targetFolder = "E:/mkdirs/";
FileUtils.moveFiles(sourceFolder, targetFolder);
}
/**
* 移动整个目录中的所有文件,并删除该文件夹
* <请替换成功能描述> <br>
* <请替换成详细描述>
* @author caizh
* @since [1.0.0]
* @version [1.0.0,2017年2月6日]
*/
@Test
public void moveFolder(){
String sourceFolder = "E:/mkdirs/";
String targetFolder = "E:/mkdir/copy/";
FileUtils.moveFolder(sourceFolder, targetFolder);
}
}