先講下,因為現在有關布局控件什麼的文章已經很多了,基本都能在網上找到
解決方法,從今以後,小馬會寫一些自己在實際開發過程中用到過的方法及碰到的問
題,小馬所犯錯誤之處會用注釋标出,以便提醒朋友們不要犯小馬這樣低級的錯誤,
今天講下批量檔案的操作及單個檔案的操作,不多廢話,直接看代碼:
/**
* @Title: DeleteFile.java
* @Description: 檔案、檔案夾操作類
* @author MZH
* @version 1.0 一般自己的工具輔助類,我個人習慣加版本号,得考慮到後期維護,友善标記
*/
public class FileUtils{
/**
* 一般情況下,小馬希望大家養成好習慣,構造方法,一般留個空的,友善擴充
*/
public FileUtils(){
}
* 删除檔案
* @param file
* @return
public boolean deleteFile(File file) {
boolean result = false;
if (file != null) {
try {
File file2 = file;
file2.delete();
result = true;
} catch (Exception e) {
e.printStackTrace();
result = false;
}
}
return result;
* 删除檔案夾
* @param folder
* 因為涉及到一個檔案夾下有檔案也有檔案夾的情況,是以寫個函數,以後直拿來用
public boolean deleteFolder(File folder) {
try {
//取得檔案下所有資訊:包括檔案及檔案夾名稱
String childs[] = folder.list();
//小馬的錯誤:是字元串數組,沒習慣判斷length大小,希望朋友們不要忘了判斷長度,養成好的習慣
if (childs == null || childs.length <= 0) {
if (folder.delete()) {
result = true;
}
} else {
for (int i = 0; i < childs.length; i++) {
String childName = childs[i];
String childPath = folder.getPath() + File.separator
+ childName;
File filePath = new File(childPath);
//小馬的錯誤:隻判斷是否存在,未判斷是檔案還是檔案夾,這樣會漏掉一大
//部分檔案的操作,是以isFile一定要加
if (filePath.exists() && filePath.isFile()) {
if (filePath.delete()) {
result = true;
} else {
result = false;
break;
}
//如果是檔案夾的操作,此及寫遞歸删除,調用自己
} else if (filePath.exists() && filePath.isDirectory()) {
if (deleteFolder(filePath)) {
}
folder.delete();
} catch (Exception e) {
e.printStackTrace();
result = false;
* 實作清空所有Temp檔案
*
* @return 是否删除成功
private boolean deleteTempFiles() {
//ApplicationData myApp = new ApplicationData();
//這一步是小馬犯的錯誤,因為繼承Application的類是可以這樣new對象,
//但不建議直接new,多分記憶體,而且還是全局的,浪費
//此處直接寫getApplication會報錯,因為需要上下檔案,
//是以這時小馬說的擴充構造方法就有用了,可以在new本類對象時會了Context對象哦,吼吼
//ApplicationData myApp = (ApplicationData)getApplication();
FileUtils df = new FileUtils();
File file = null;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
//因為類似臨時檔案,一般都在最開始建立,最後删除,
//是以小馬把建議類似操作放在Application裡面操作,取值操作都友善
file = new File(TEMP); //TEMP為臨時檔案存放的檔案夾路徑
return df.deleteFolder(file);
* 儲存時将臨時檔案夾下所有檔案移至目标檔案夾下
* @param oldLocation 源檔案夾
* @param newLocation 目标檔案夾
* @throws IOException 異常
* @throws NoSpaceIOException 磁盤空間不足 小馬自定義的異常類,可以跳過
public void moveFile(File oldLocation, File newLocation)
throws IOException, NoSpaceIOException {
boolean isMkdirs = false;
File file = new File(newLocation.getPath()+File.separator+"此處拼接檔案名");
if(!file.exists()){
isMkdirs = file.mkdirs();
if(isMkdirs){
String childs[] = oldLocation.list();
if(oldLocation != null && oldLocation.exists()){
for(int i=0;i<childs.length;i++){
String childName = childs[i];
String childPath = oldLocation.getPath()+File.separator+childName;
File filePath = new File(childPath);
if(filePath.exists() && filePath.isFile()){
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(filePath);
//下面這句中的false是用來判斷是否是append追加狀态,
//不懂的朋友們可以直接通路:http://developer.android.com/reference/java/io/File.html
//來檢視相關方法參數的具體涵義,吼吼
fos = new FileOutputStream(new File(file.getPath()+File.separator+childName),false);
byte[] buff = new byte[8192];
int readIn ;
//此處注意下:read方法中的參數如果不寫的話,會讀不到檔案内容,
//報異常,小馬犯過的低級錯誤,希望你不要犯啦
while((readIn = fis.read(buff,0,buff.length))!= -1){
fos.write(buff,0,readIn);
}
fos.flush();
} catch (Exception e) {
e.printStackTrace();
/*if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
// 如果有sdcard,磁盤空間是否滿了
Log.d(TAG, "DMUtils>>>sdcard is ok!");
// No space left on device
if (ex.getMessage() != null
&& ex.getMessage().indexOf(
"No space left on device") != -1) {
// 磁盤空間滿
throw new NoSpaceIOException(ex.getMessage());
}
} else {
// 檔案儲存失敗應該檢查sd卡
Log.d(TAG, "DMUtils>>>sdcard is error!state: "
+ android.os.Environment.getExternalStorageState());
throw new IOException(ex.getMessage()
+ " IOException when transferring "
+ oldLocation.getPath() + " to "
+ newLocation.getPath());*/
}finally{
//大夥應該很熟悉了吧?小馬一朋友犯過的錯誤,未關閉流,
//導緻生成的檔案本來是KB的卻成了MB的檔案,是以一定注意打開什麼就關閉什麼
try {
if(fis!=null){
fos.close();
if(fos!=null){
} catch (Exception e2) {
e2.printStackTrace();
}
/*
* 因為此處小馬用的是一個檔案夾下的檔案操作,并不包含子檔案夾,
* 是以:如果有朋友要用子檔案夾操作的話可激活此處遞歸處理哦
*/
/*else if(filePath.exists() && filePath.isDirectory()){
moveFile(filePath,new File("此處路徑從全局檔案中取就OK了"));
}*/
}
}
上面代碼中的方法,朋友們可以直接使用,但小馬多嘴講下:不要直接把代碼COPY到你使用的工程中,因為那樣本就沒經過思考,以後碰到類似的問題也就不會解決了,小馬很菜,這些代碼如果我自己寫不出來,就用個笨的方法,一邊看一邊想,再不行就照抄一邊,眼過十遍不如手過一遍聽過吧?想通了也就最好了,不會的時候再反過來看下就可以了,是以盡量不使用COPY的方式哦,吼吼。。O_O
本文轉自華華世界 51CTO部落格,原文連結:http://blog.51cto.com/mzh3344258/741315,如需轉載請自行聯系原作者