package bruce.lib.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
/**
* @author Bruce Tsai
*
*/
public final class FileFactory {
/**
* 建立目錄, 若父層目錄不存在一併建立
*
* @param file
* 目錄路徑
*/
public static void createDirectory(String file) {
createDirectory(new File(file));
}
/**
* 建立目錄, 若父層目錄不存在一併建立
*
* @param file
* 目錄
*/
public static void createDirectory(File file) {
if (file.getParentFile() != null && !file.getParentFile().exists()) {
createDirectory(file.getParentFile());
}
if (!file.exists())
file.mkdir();
}
/**
* 刪除檔案或目錄, 若刪除的為目錄, 一併刪除目錄下的所有檔案
*
* @param file
* 檔案或目錄
*/
public static void delete(String file) {
delete(new File(file));
}
/**
* 刪除檔案或目錄, 若刪除的為目錄, 一併刪除目錄下的所有檔案
*
* @param file
* 檔案或目錄
*/
public static void delete(File file) {
if (file.exists()) {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
FileFactory.delete(f);
}
}
int limit = 10 * 1000; // 10秒
long tick = System.currentTimeMillis();
while (file.exists()) {
// 指定時間內無法刪除時擲出例外
if (file.delete() && System.currentTimeMillis() - tick > limit)
throw new RuntimeException();
}
}
}
/**
* 複製檔案或目錄
*
* @param sourceFile
* 來源檔案或目錄
* @param destFile
* 目的目錄
* @throws IOException
*/
public static void copy(String sourceFile, String destFile) throws IOException {
copy(new File(sourceFile), new File(destFile));
}
/**
* 複製檔案或目錄
*
* @param sourceFile
* 來源檔案或目錄
* @param destFile
* 目的目錄
* @throws IOException
*/
public static void copy(File sourceFile, File destFile) throws IOException {
if (sourceFile.isFile()) {
sourceFile.setReadable(true);
FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(destFile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] buffer = new byte[128];
int readed = -1;
while ((readed = bis.read(buffer)) > -1) {
bos.write(buffer, 0, readed);
}
bos.close();
fos.close();
fis.close();
fos.close();
} else {
destFile.mkdir();
File[] files = sourceFile.listFiles();
for (File f : files) {
copy(f, new File(String.format("%s\\%s", destFile.getAbsolutePath(), f.getName())));
}
}
}
/**
* 讀取檔案內的全部文字資料
*
* @param file
* 要讀取的檔案
* @return
* @throws IOException
*/
public static String readAllText(File file) throws IOException {
return new String(readAllBytes(file));
}
/**
* 讀取檔案內的全部文字資料
*
* @param file
* 要讀取的檔案
* @param encoding
* 文字編碼
* @return
* @throws IOException
*/
public static String readAllText(File file, String encoding) throws IOException {
return new String(readAllBytes(file), encoding);
}
/**
* 讀取檔案內的全部位元資料
*
* @param file
* 要讀取的檔案
* @return
* @throws IOException
*/
public static byte[] readAllBytes(File file) throws IOException {
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = -1;
while ((b = fis.read()) > -1) {
baos.write(b);
}
baos.close();
fis.close();
return baos.toByteArray();
}
/**
* 將內容寫入檔案. 寫入時呼叫 toString() 並將回傳值寫入檔案
*
* @param file
* 要寫入的檔案
* @param content
* 要寫入的內容
* @throws IOException
*/
public static void writeAllText(File file, Object content) throws IOException {
FileWriter writer = new FileWriter(file);
writer.write(content.toString());
writer.close();
}
/**
* 將內容寫入檔案. 寫入時呼叫 toString() 並將回傳值寫入檔案
*
* @param file
* 要寫入的檔案
* @param content
* 要寫入的內容
* @param encoding
* 文字編碼
* @throws IOException
*/
public static void writeAllText(File file, Object content, String encoding) throws IOException {
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter writer = new OutputStreamWriter(fos, encoding);
writer.write(content.toString());
writer.close();
fos.close();
}
/**
* 將內容寫入檔案. 寫入時呼叫 toString() 並將回傳值寫入檔案, 若檔案存在, 將內容加入至檔案結尾, 檔案不存在時, 直接寫入
*
* @param file
* 要寫入的檔案
* @param content
* 要寫入的內容
* @throws IOException
*/
public static void appendAllText(File file, Object content) throws IOException {
FileWriter writer = new FileWriter(file, true);
writer.write(content.toString());
writer.close();
}
/**
* 將內容寫入檔案. 寫入時呼叫 toString() 並將回傳值寫入檔案, 若檔案存在, 將內容加入至檔案結尾, 檔案不存在時, 直接寫入
*
* @param file
* 要寫入的檔案
* @param content
* 要寫入的內容
* @param encoding
* 文字編碼
* @throws IOException
*/
public static void appendAllText(File file, Object content, String encoding) throws IOException {
if (file.exists()) {
appendAllText(file, content);
} else {
writeAllText(file, content, encoding);
}
}
/**
* 將內容寫入檔案
*
* @param file
* 要寫入的檔案
* @param bytes
* 要寫入的內容
* @throws IOException
*/
public static void writeAllBytes(File file, byte[] bytes) throws IOException {
FileOutputStream fos = new FileOutputStream(file);
fos.write(bytes);
fos.close();
}
/**
* 將內容寫入檔案. 若檔案存在, 將內容加入至檔案結尾, 檔案不存在時, 直接寫入
*
* @param f
* 要寫入的檔案
* @param bytes
* 要寫入的內容
* @throws IOException
*/
public static void appendAllBytes(File f, byte[] bytes) throws IOException {
FileOutputStream fos = new FileOutputStream(f, true);
fos.write(bytes);
fos.close();
}
}