对File的一些基础操作
在学习的过程当中主要看了java的api,同时参考apache的一些file工具类,io工具类,感觉收获不小
- 新增文件
- 新增文件目录,若目录不存在,自动进行创建;File对象的createFile方法不支持目录不存在的创建
- 支持多级空目录的创建
- 删除文件目录,若目录里面存在文件,则进行递归删除
- 支持多级目录的删除,支持非空目录删除
- 移动文件(目录)到指定的位置
- 复制文件(目录)到指定的位置,在复制含有文件的目录的时候未完成
- 目标目录为空时,自动创建
- 支持复制文件夹及文件夹下的文件
- 显示文件内容
需要注意事项
- createNewFile不支持目录不存在的文件创建方法
- mkdirs支持多目录不存在的递归创建
- rename只支持同级目录下的重命名,不支持不同目录的重命名
- intputStream入参对象不能为目录
package com.pgy.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
public class FileApi {
/** 文件读取结束标志 */
private static final int EOF = -1;
/** 默认读取空间大小 */
private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
public static void main(String[] args) {
String deleteFilePath = "/Users/admin/logs/aa/";
String createFilePath = "/Users/admin/logs/aa/bb/cc/test.txt";
String targetFilePath = "/Users/admin/logs/aa/bb/cc/";
String sourceDirPath = "/Users/admin/logs/aa/bb/dd/";
File createFile = new File(createFilePath);
File DeleteFile = new File(deleteFilePath);
File targetFile = new File(targetFilePath);
File sourceFile = new File(sourceDirPath);
// createFile(createFile);
//
// copyFile(targetFile, sourceFile);
//
// mvFile(createFile, targetFile);
// deleteFile(DeleteFile);
// System.out.println(getFileContent(targetFile, "utf-8"));
}
/**
* 获取file当中的内容,为string类型
* @param file file对象
* @param charset 字符串编码
* @return
*/
public static final String getFileContent(File file, String charset) {
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
Reader reader = new InputStreamReader(fis, charset);
StringWriter sw = new StringWriter();
parseReaderToWrite(reader, sw);
return sw.toString();
} catch (Exception e) {
}
return null;
}
/**
* File.rename方法只支持同级目录下的重命名
* 先拷贝文件,然后再删除源文件
* @param sourceFile
* @param targetFile
*/
public static final void mvFile(File sourceFile, File targetFile) {
copyFile(sourceFile, targetFile);
deleteFile(sourceFile);
}
/**
* 用FileInputStream与FileOutputStream方式进行对文件的读写操作,完成copy
* 也可以通过FileReader与FileWirte进行实现
* @param sourceFile
* @param targetFile
*/
public static final void copyFile(File sourceFile, File targetFile) {
FileInputStream fis = null;
FileOutputStream fos = null;
if (!targetFile.exists()) {
createFile(targetFile);
}
try {
File[] fileList = sourceFile.listFiles();
for (File file : fileList) {
File newTargetFile = null;
if (file.isFile()) {
fis = new FileInputStream(file);
newTargetFile = new File(targetFile, file.getName());
fos = new FileOutputStream(newTargetFile);
parseInputStreamToOutputStream(fis, fos);
fis.close();
fos.close();
}
if (file.isDirectory()) {
File oldFile = new File(sourceFile, file.getName());
File newFile = new File(targetFile, file.getName());
copyFile(oldFile, newFile);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 将inputStream转换为OutputStream
* @param input
* @param output
* @return
* @throws IOException
*/
public static long parseInputStreamToOutputStream(InputStream input, OutputStream output)
throws IOException {
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
long count = 0;
int n = 0;
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
/**
* 将reader转换为write
* @param input
* @param output
* @return
* @throws IOException
*/
public static long parseReaderToWrite(Reader input, Writer output) throws IOException {
char[] buffer = new char[DEFAULT_BUFFER_SIZE];
long count = 0;
int n = 0;
while (EOF != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
/**
* 删除文件
* File.delete不支持目录不为空的删除
* 判断file对象列表当中的目录进行循环删除
* @param file
*/
public static final void deleteFile(File file) {
if (file.exists()) {
file.delete();
}
if (file.isDirectory()) {
File[] fileList = file.listFiles();
for (File fileChild : fileList) {
deleteFile(fileChild);
}
}
}
/**
* File对象createFile方法,不支持目录不存在的文件创建
* 对其parent进行判断,若不存在,则对目录先进行递归创建
*
* @param filePath
*/
public static final void createFile(File file) {
File fileDir = file.getParentFile();
if (!fileDir.exists()) {
fileDir.mkdirs();
}
if (!file.getName().contains(".") && !file.exists()) {
file.mkdir();
}
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 合并字符串为目录
* 由于不同的操作系统当中对于目录的层级分割是不一样的,例如:windows: 其它的:/
* 在拼接目录的时候我们不能单纯的使用/或来进行拼接
* @param parent
* @param child
* @return
*/
public static final File spliceFile(String parent, String child) {
return new File(parent, child);
}
public static void fileInfoPrint(File file) throws IOException {
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.canExecute());
System.out.println(file.getAbsolutePath());
System.out.println(file.getAbsoluteFile());
System.out.println(file.getCanonicalPath());
System.out.println(file.getUsableSpace());
System.out.println(file.getTotalSpace());
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.getParentFile());
System.out.println(file.getPath());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.isHidden());
System.out.println(file.isAbsolute());
System.out.println(file.length());
System.out.println(file.exists());
System.out.println(file.hashCode());
System.out.println(file.toString());
System.out.println(file.toPath());
System.out.println(file.toURI());
file.setExecutable(true, false);
file.setReadable(true);
file.setWritable(true);
file.setReadOnly();
}
}