【android 檔案的基本操作】
阿新 • • 發佈:2019-02-16
在此總結一下檔案的基本操作。
先把一些常用的方法,封裝一下,我這些都放到 FileUtils.java 類中:
/**
* sd卡是否可用
*
* @return
*/
public static boolean isSdCardAvailable() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
/**
* 建立根快取目錄
*
* @return
*/
public static String createRootPath() {
if (isSdCardAvailable()) {
// /sdcard/Android/data/<application package>/cache
cacheRootPath = MyApplication.mContext.getExternalCacheDir().getPath();
} else {
// /data/data/<application package>/cache
cacheRootPath = MyApplication.mContext.getCacheDir().getPath();
}
return cacheRootPath;
}
/**
* 建立資料夾
*
* @param dirPath
* @return 建立失敗返回""
*/
public static String createDir(String dirPath) {
try {
File dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdirs();
}
return dir.getAbsolutePath();
} catch (Exception e) {
e.printStackTrace();
}
return dirPath;
}
/**
* 建立檔案
* 檔案路徑為根路徑:/storage/emulated/0/Android/data/<application package>/cache
*/
public static boolean createFile(Context context, String uniqueName) {
File file = getDiskCacheDir(context, uniqueName);
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 往檔案中儲存內容,根據檔案路徑,這個方法更嚴謹一些
*
* @param content
* @param filePath
* @return
*/
public static boolean saveStringToFile(String content, String filePath) {
if (content == null || TextUtils.isEmpty(filePath)) {
return false;
} else {
File file = new File(filePath);
PrintWriter pw = null;
try {
if (!file.exists()) {
file.createNewFile();
}
if (file.exists()) {
pw = new PrintWriter(file);
// pw = new PrintWriter(new BufferedWriter(
// new FileWriter(file)));
pw.write(content);
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
} finally {
if (pw != null) {
pw.close();
}
}
}
}
/**
* 讀取檔案中的內容,根據檔案路徑
*
* @param filePath
* @return
*/
@SuppressWarnings("resource")
public static String readStringFromFile(String filePath) {
if (TextUtils.isEmpty(filePath)) {
return null;
}
File file = new File(filePath);
if (file.exists()) {
try {
StringBuffer strBuffer = new StringBuffer();
BufferedReader reader = new BufferedReader(new FileReader(file));
String strLine = "";
while ((strLine = reader.readLine()) != null) {
strBuffer.append(strLine);
}
return strBuffer.toString();
} catch (Exception e) {
return null;
}
} else {
return null;
}
}
/**
* 根據傳進的 file 刪除檔案或者資料夾
*
* @param file
*/
public static void deleteFileOrDirectory(File file) {
try {
if (file.isFile()) {
file.delete();
return;
}
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
// 刪除空資料夾
if (childFiles == null || childFiles.length == 0) {
file.delete();
return;
}
// 遞迴刪除資料夾下的子檔案
for (int i = 0; i < childFiles.length; i++) {
deleteFileOrDirectory(childFiles[i]);
}
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根據傳進的 filePath 刪除檔案或者資料夾
*
* @param filePath
* @return boolean
*/
public static boolean deleteFileOrDirectory(String filePath) {
if (TextUtils.isEmpty(filePath)) {
return false;
} else {
try {
File file = new File(filePath);
if (file.isFile()) {
file.delete();
return true;
}
if (file.isDirectory()) {
File[] childFiles = file.listFiles();
// 刪除空資料夾
if (childFiles == null || childFiles.length == 0) {
file.delete();
return true;
}
// 遞迴刪除資料夾下的子檔案
for (int i = 0; i < childFiles.length; i++) {
deleteFileOrDirectory(childFiles[i]);
}
file.delete();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
/**
* 將內容寫入檔案
*
* @param filePath eg:/mnt/sdcard/demo.txt
* @param content 內容
*/
public static void writeFileSdcard(String filePath, String content, boolean isAppend) {
try {
FileOutputStream fout = new FileOutputStream(filePath, isAppend);
byte[] bytes = content.getBytes();
fout.write(bytes);
fout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 根據傳入的檔名字,在根快取目錄下建立檔案,並返回該檔案物件
*
* @param context
* @param uniqueName
* @return
*/
public static File getDiskCacheDir(Context context, String uniqueName) {
final String cachePath = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) ? getExternalCacheDir(context).getPath() : context.getCacheDir().getPath();
return new File(cachePath + File.separator + uniqueName);
}
public static File getExternalCacheDir(Context context) {
final String cacheDir = "/Android/data/" + context.getPackageName() + "/cache/";
return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
}
/**
* 獲取圖片快取目錄
*
* @return 建立失敗, 返回""
*/
public static String getImageCachePath() {
String path = createDir(createRootPath() + File.separator + "img"
+ File.separator);
return path;
}
/**
* 獲取圖片裁剪快取目錄
*
* @return 建立失敗, 返回""
*/
public static String getImageCropCachePath() {
String path = createDir(createRootPath() + File.separator + "imgCrop"
+ File.separator);
return path;
}
有個這個工具類,就可以對檔案做一些基本的操作了!
在應用根快取目錄下或者在某某目錄下實現如下操作:建立一個資料夾 ——>資料夾中建立一個檔案 ——> 往檔案中寫入內容 ——> 讀取內容 ——> 刪除該檔案 ——> 刪除該資料夾 。
(1)建立一個資料夾
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivityfile";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 建立 log 資料夾
*/
String folderPath = FileUtils.createDir("data/data/" + getPackageName() + "/log");
Log.i(TAG, "onCreate: folderPath=" + folderPath);
}
}
adb檢視如下:
(2)資料夾中建立一個檔案
/**
* 建立 info 檔案,在 log 資料夾中
*/
File file = new File(folderPath, "/info");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
adb檢視如下:
(3) 往檔案中寫入內容
/**
* 往檔案中寫入內容
*/
boolean saveResult = FileUtils.saveStringToFile("我是來記錄info級別的日誌", folderPath + "/info");
Log.i(TAG, "onCreate: saveResult=" + saveResult);
adb命令 pull 下來如下:
(4) 讀取檔案內容
/**
* 讀取內容
*/
String fileContext = FileUtils.readStringFromFile(folderPath + "/info");
Log.i(TAG, "onCreate: fileContext=" + fileContext);
日誌列印:
(5)刪除該檔案
/**
* 刪除該檔案
*/
//FileUtils.deleteFileOrDirectory(file);
boolean deleteResult = FileUtils.deleteFileOrDirectory(folderPath + "/info");
Log.i(TAG, "onCreate: deleteResult=" + deleteResult);
日誌列印:
adb檢視發現:log 資料夾下已經沒有 info 檔案了:
(6) 刪除該資料夾
/**
* 刪除該資料夾
*/
boolean deleteDirectoryResult = FileUtils.deleteFileOrDirectory(folderPath);
Log.i(TAG, "onCreate: deleteDirectoryResult=" + deleteDirectoryResult);
日誌列印:
adb檢視,log 資料夾已經沒有了:
總結:到這裡對檔案的基本操作,基本完成了。下面,希望我繼續擠出時間,去總結對 檔案 的上傳,下載的運用。
注意:原始碼中看app2這個module