package com.hdl.photovoltaic.other;
|
|
import android.graphics.Bitmap;
|
import android.graphics.BitmapFactory;
|
import android.os.Environment;
|
|
import com.hdl.photovoltaic.HDLApp;
|
import com.hdl.photovoltaic.config.UserConfigManage;
|
|
import java.io.BufferedInputStream;
|
import java.io.BufferedOutputStream;
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.FileInputStream;
|
import java.io.FileOutputStream;
|
import java.io.InputStream;
|
import java.io.InputStreamReader;
|
import java.util.Objects;
|
|
/**
|
* 文件操作的逻辑
|
*/
|
public class HdlFileLogic {
|
|
private static volatile HdlFileLogic sHdlFileLogic;
|
|
/**
|
* 表示1m数据
|
*/
|
private final int m = 1;
|
|
/**
|
* 获取当前对象
|
*
|
* @return HdlFileLogic
|
*/
|
public static synchronized HdlFileLogic getInstance() {
|
if (sHdlFileLogic == null) {
|
synchronized (HdlFileLogic.class) {
|
if (sHdlFileLogic == null) {
|
sHdlFileLogic = new HdlFileLogic();
|
}
|
}
|
|
}
|
return sHdlFileLogic;
|
}
|
|
private static final String TAG = "FileUtils";
|
|
private String getUserId() {
|
return UserConfigManage.getInstance().getUserId();
|
}
|
|
private String getHomeId() {
|
return UserConfigManage.getInstance().getHomeId();
|
}
|
//region ---------root路径-----------
|
|
/**
|
* 获取手机内部存储文件路径
|
*/
|
public String getAPPInternalStoreFilesPath() {
|
return HDLApp.getInstance().getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getPath();
|
}
|
|
/**
|
* 获取存放【用户】文件夹根路径
|
*/
|
public String getCurrentUserRootPath() {
|
return getAPPInternalStoreFilesPath() + "/" + getUserId();
|
}
|
|
/**
|
* 获取存放【住宅】文件夹根路径
|
*/
|
public String getCurrentHomeRootPath() {
|
return getCurrentUserRootPath() + "/" + "home_" + getHomeId();
|
}
|
|
/**
|
* 获取【日志】文件全路径
|
*/
|
public String getLogFilePath() {
|
return getCurrentHomeRootPath() + "/Log.txt";
|
}
|
|
/**
|
* 获取【用户】文件全路径
|
*/
|
public String getUserFilePath() {
|
return getAPPInternalStoreFilesPath() + "/UserConfigManage.txt";
|
}
|
|
//endregion
|
|
//region ---------【文件夹】操作-----------
|
|
/**
|
* 预创建文件夹
|
*/
|
public void createDirectory() {
|
//存放住宅信息
|
this.createFileDir(this.getCurrentHomeRootPath());
|
}
|
|
/**
|
* 创建文件夹
|
*
|
* @param fullPath fullPath 全路径
|
* @return -
|
*/
|
public boolean createFileDir(String fullPath) {
|
try {
|
File file = new File(fullPath);
|
if (!file.isDirectory()) {
|
boolean succeed = file.mkdirs();
|
System.out.println("创建文件夹路径=" + file.getAbsolutePath() + "->->创建文件夹结果=" + succeed);
|
return succeed;
|
}
|
return true;
|
} catch (Exception e) {
|
System.out.println("创建文件夹有异常===" + e.getMessage());
|
return false;
|
}
|
}
|
|
|
/**
|
* 删除文件夹
|
*
|
* @param fullPath 全路径
|
*/
|
public void deleteDirectory(String fullPath) {
|
try {
|
File fileRoot = new File(fullPath);
|
if (fileRoot.isDirectory()) {
|
File[] listFiles = fileRoot.listFiles();
|
if (listFiles != null) {
|
for (File file : listFiles) {
|
if (file.isDirectory()) {
|
deleteDirectory(file.getAbsolutePath());
|
} else {
|
this.deleteFile(file.getAbsolutePath());
|
}
|
}
|
}
|
}
|
// 删除文件夹本身
|
boolean succeed = fileRoot.delete();//文件夹空这个方法才有效
|
System.out.println("删除文件夹路径=" + fileRoot.getAbsolutePath() + "->->删除结果=" + succeed);
|
} catch (Exception e) {
|
System.out.println("删除文件夹有异常===" + e.getMessage());
|
}
|
|
}
|
|
|
//endregion
|
|
//region ---------【文件】操作-----------
|
|
/**
|
* 创建文件
|
*
|
* @param fullPath 全路径
|
* @return -
|
*/
|
public boolean createFile(String fullPath) {
|
try {
|
File file = new File(fullPath);
|
if (!file.exists()) {
|
boolean succeed = file.createNewFile();
|
System.out.println("创建文件路径=" + file.getAbsolutePath() + "->->创建文件结果=" + succeed);
|
return succeed;
|
}
|
return true;
|
} catch (Exception e) {
|
System.out.println("创建文件有异常===" + e.getMessage());
|
return false;
|
}
|
}
|
|
/**
|
* 删除文件
|
*
|
* @param fullPath 全路径
|
* @return -
|
*/
|
public boolean deleteFile(String fullPath) {
|
try {
|
File file = new File(fullPath);
|
if (file.exists()) {
|
boolean succeed = file.delete();
|
System.out.println("删除文件===" + succeed);
|
return succeed;
|
}
|
return true;
|
} catch (Exception e) {
|
System.out.println("删除文件有异常===" + e.getMessage());
|
return false;
|
}
|
|
}
|
|
|
/**
|
* 写入文件
|
*
|
* @param fullPath 全路径
|
* @param data 数据
|
*/
|
public void writeFile(String fullPath, String data) {
|
try {
|
File file = new File(fullPath);
|
if (!file.exists()) {
|
if (!createFile(fullPath)) {
|
//创建失败直接返回
|
return;
|
}
|
}
|
FileOutputStream d = new FileOutputStream(file);
|
d.write(data.getBytes());
|
d.flush();
|
d.close();
|
System.out.println("写入文件成功==" + fullPath);
|
} catch (Exception e) {
|
System.out.println("写入文件有异常==" + e.getMessage());
|
}
|
|
}
|
|
/**
|
* 写入文件(一行一行追加内容)
|
*
|
* @param fullPath 全路径
|
* @param dataLine 数据
|
*/
|
public void appendFile(String fullPath, String dataLine) {
|
try {
|
if (!isBoolean(fullPath)) {
|
return;
|
}
|
File file = new File(fullPath);
|
if (!file.exists()) {
|
if (!createFile(fullPath)) {
|
//创建失败直接返回
|
return;
|
}
|
}
|
FileOutputStream d = new FileOutputStream(file, true);
|
d.write(dataLine.getBytes());
|
d.write("\r\n".getBytes());// 写入一个换行
|
d.flush();
|
d.close();
|
if (file.length() > 1024 * 1024 * m) {
|
//文件大于1m,删除文件前10条日志
|
this.delFileLien(fullPath, 10);
|
}
|
System.out.println("写入一行数据到文件成功===" + dataLine);
|
} catch (Exception e) {
|
System.out.println("写入一行数据到文件有异常===" + e.getMessage());
|
}
|
|
}
|
|
/**
|
* 读取文件
|
*
|
* @param filePath 全路径
|
* @return 数据
|
*/
|
public String readFile(String filePath) {
|
try {
|
if (!isBoolean(filePath)) {
|
return "";
|
}
|
String fileContent = "";
|
File f = new File(filePath);
|
if (!f.exists()) {
|
return fileContent;
|
}
|
FileInputStream fis = new FileInputStream(f);
|
byte[] bytes = new byte[fis.available()];
|
fis.read(bytes);
|
fis.close();
|
System.out.println("读取文件成功===" + filePath);
|
fileContent = new String(bytes);
|
return fileContent;
|
} catch (Exception e1) {
|
System.out.println("读取文件有异常===" + e1.getMessage());
|
return "";
|
}
|
|
}
|
|
/**
|
* 指定删除文件行数(从前面删除起)
|
*
|
* @param filePath 路径
|
* @param delLienSum 删除多少行数
|
*/
|
public void delFileLien(String filePath, int delLienSum) {
|
if (!isBoolean(filePath)) {
|
return;
|
}
|
//打开文件
|
File file = new File(filePath);
|
//如果path是传递过来的参数,可以做一个非目录的判断
|
if (file.isDirectory()) {
|
System.out.println("这是一个目录");
|
return;
|
}
|
StringBuilder content = new StringBuilder(); //文件内容字符串
|
try {
|
InputStream inputStream = new FileInputStream(file);
|
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
|
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
|
String line;
|
int lineCount = 0;
|
//分行读取
|
while ((line = bufferedReader.readLine()) != null) {
|
lineCount += 1;
|
if (lineCount > delLienSum) {
|
content.append(line).append("\r\n");
|
}
|
}
|
inputStream.close();
|
//删除掉旧文件
|
this.deleteFile(filePath);
|
//重新创建文件并且写入数据
|
this.writeFile(filePath, content.toString());
|
} catch (Exception ignored) {
|
}
|
}
|
|
/**
|
* 判断路径是否合法
|
*
|
* @param path 路径
|
* @return true合法
|
*/
|
public boolean isBoolean(String path) {
|
if (path.contains("//") || path.contains("\\")) {
|
System.out.println("无效文件路径===" + path);
|
return false;
|
}
|
return true;
|
}
|
//endregion
|
|
/**
|
* 把位图数据保存到指定路径的图片文件
|
*/
|
public void writeImage(String path, Bitmap bitmap) {
|
try {
|
//根据指定文件路径构建缓存输出流对象
|
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
|
//把位图数据压缩到缓存输出流中
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
|
//完成缓存输出流的写入动作
|
bos.flush();
|
//关闭缓存输出流
|
bos.close();
|
|
|
} catch (Exception ignored) {
|
}
|
}
|
//</editor-fold>
|
|
/**
|
* 从指定路径的图片文件中读取位图数据
|
*/
|
public Bitmap readImage(String path) {
|
try {
|
//根据指定文件路径构建缓存输入流对象
|
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
|
//从缓存输入流中解码位图数据
|
Bitmap bitmap = BitmapFactory.decodeStream(bis);
|
//关闭缓存输入流
|
bis.close();
|
return bitmap;
|
} catch (Exception e) {
|
}
|
return null;
|
}
|
|
|
}
|