對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();
}
}