如果你要封装工具类,注意使用static关键字
有两点放最前面说明一下:
- 本文大部分方法都涉及SD卡读写,因此注意在manifest文件里设置相关权限。如果你的目标SDK是23(对应Android 6.0)或更高,还要在Java代码里动态申请权限。相关知识可以戳这里
- Java的一些文件相关方法是有布尔返回值的(比如createNewFile()返回true代表创建成功,false则代表失败),如果不做处理,编译器会发出警告。多数情况下,不处理并不影响功能运转,而且即使严格要求必须处理,也没有太固定的写法——故本文不给出具体处理的代码,请见谅。
其它有错误或者需要补充的欢迎及时指正~~
相关阅读:Android开发常用的Util方法(屏幕UI篇)
创建一个文件夹
public void createDir(String path) {
File dir = new File(path);
if (!dir.exists()) {
dir.mkdirs();
}
}
调用:createDir(文件夹路径)
说明:例子里没有返回值,可根据需要灵活设定返回值。后面不再详述
创建一个文件
public void createFile(String path) {
File file = new File(path);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
}
调用:createDir(文件完整路径)
说明:需要处理或抛出IOException异常。
删除文件或文件夹
public void deleteFile(File file) {
if (file.isFile()) {
file.delete();
} else if (file.isDirectory()) {
//清空文件夹
File[] files = file.listFiles();
int length = files.length;
int index = 0;
while (length != 0) {
deleteFile(files[index]);
index++;
length--;
}
//删除文件夹
file.delete();
}
}
调用:deleteFile(要删除的文件或文件夹)
说明:必须清空文件夹后才能删除之,如果只想清空文件夹,可只封装相关一部分内容。另可考虑重载一个参数是文件路径(String类型)的方法
判断是否有SD卡
public boolean sdcardAvailable() {
String s = Environment.getExternalStorageState();
return s.equals(Environment.MEDIA_MOUNTED);
}
调用:你懂的……
说明:返回true表示有SD卡,false表示无。友情提醒,我们常说的手机运存相当于电脑内存;手机机身内存又称内置SD卡,相当于电脑硬盘;而这里的SD卡指的是外置SD卡,相当于U盘或移动硬盘。
计算文件或文件夹大小
//首先计算出用数字表示的值
public long getFolderSize(File file) {
long size = 0;
File[] files = file.listFiles();
for (File f : files) {
size += f.isDirectory() ? getFolderSize(f) : f.length();
}
return size;
}
//然后将得到的值格式化
public String getFormatSize (double size) {
double kB = size / 1024;
if (kB < 1) {
return size + "B";
}
double mB = kB / 1024;
if (mB < 1) {
BigDecimal result1 = new BigDecimal(Double.toString(kB));
//2表示保留两位小数,ROUND_HALF_UP表示四舍五入
return result1.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "KB";
}
double gB = mB / 1024;
if (gB < 1) {
BigDecimal result2 = new BigDecimal(Double.toString(mB));
return result2.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "MB";
}
double tB = gB / 1024;
if (tB < 1) {
BigDecimal result3 = new BigDecimal(Double.toString(gB));
return result3.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "GB";
}
BigDecimal result4 = new BigDecimal(tB);
return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB";
}
调用:getFormatSize(getFolder(文件或文件夹))
说明:这里使用了BigDecimal(大数字精确运算)类,最终返回的格式是诸如”12.34MB”一类的字符串,四舍五入保留两位小数,带单位。可根据实际需要自行调整位数、取舍方式和单位
文件转输入流
public InputStream file2Is(File file) {
return new FileInputStream(file);
}
调用:file2Is(要转换的文件)
说明:调用完毕记得关流,后面不再详述;另外需要处理或抛出FileNotFoundException异常。附俩方法——
//字符串转输入流
public InputStream String2Is(String s){
return new ByteArrayInputStream(s.getBytes());
}
//输入流转字符串(需要抛出或处理IOException异常)
public String is2String(InputStream is) {
ByteArrayOutputStream baoS = new ByteArrayOutputStream();
int i;
while((i = is.read()) != -1) {
baoS.write(i);
}
return baoS.toString();
}
输入流转文件
public File is2File(InputStream ins, File file) {
OutputStream os = new FileOutputStream(file);
int bytesRead;
//这里设置缓冲区为8K大小,可根据实际情况变更
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
return file;
}
调用:is2File(要转换的输入流, 目标文件)
说明:目标文件一般在方法外预先声明定义。需要处理或抛出IOException和FileNotFoundException(它是IOException的子类)异常。
Bitmap转文件
public static File bmp2File(Bitmap bmp, File file, Bitmap.CompressFormat format, int quality) {
FileOutputStream fos = new FileOutputStream(file);
bmp.compress(format, quality, fos);
fos.flush();
fos.close();
return file;
}
调用:bmp2File(要转换的bmp, 目标文件, 压缩格式, 压缩质量)
说明:参数较多,可根据实际需求重载,主要是压缩格式和压缩质量这两个,压缩格式一般是JPEG(也有PNG和WEBP可选),压缩质量数字越小压缩度越大(当然质量也越差),一般项目可传70或80,传100则代表不压缩。另外此方法需要处理或抛出IOException和FileNotFoundException异常。至于文件转Bitmap应该都知道是怎么弄的吧?