app开发,文件的读写是很常用的一项功能,对于文件的读写,因为raw或者asset下只能放置不大于1M的文件,而且只能读取数据,不能写入数据。所以我们开发应用的时候,一般会将图片,或者从网络下载的数据保存到sdcard或者data/data/文件夹下,本文简单介绍了将一张图片文件分别从sdcard或者data/data文件夹进行读写操作。
第一步:申请相关权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
第二步:编写File操作相关类FileUtils.java
package com.figo.study.utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
* 文件操作相关
*/
public class FileUtils {
public static String getFilename(String filePath) {
if (filePath == null)
return null;
final int pos = filePath.indexOf(".");
if (pos < 0)
return filePath;
return filePath.substring(0, pos);
}
public static boolean isZip(File file) {
ZipFile zf = null;
try {
zf = new ZipFile(file);
zf.entries();
return true;
} catch (Exception e) {
return false;
} finally {
IOUtil.closeQuietly((Object) zf);
}
}
public static boolean extractZip(File file, File parent) {
ZipFile zf = null;
try {
zf = new ZipFile(file);
Enumeration<? extends ZipEntry> entries = zf.entries();
if (entries == null)
return false;
final byte[] buf = new byte[256];
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (entry == null)
continue;
if (entry.isDirectory()) {
File dir = new File(parent, entry.getName());
dir.mkdirs();
continue;
}
File dstFile = new File(parent, entry.getName());
if (!dstFile.exists()) {
dstFile.getParentFile().mkdirs();
}
InputStream fis = zf.getInputStream(entry);
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new FileOutputStream(dstFile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int read = 0;
while ((read = bis.read(buf)) > 0) {
bos.write(buf, 0, read);
}
fis.close();
bis.close();
bos.close();
fos.close();
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
IOUtil.closeQuietly((Object) zf);
}
}
public static boolean deleteRecursively(final File path) {
if (path.isDirectory()) {
final File[] files = path.listFiles();
if (files != null) {
for (final File child : files) {
deleteRecursively(child);
}
}
}
return path.delete();
}
public static boolean deleteFilteredFiles(final File dir, final FilenameFilter fileNameFilter) {
if (!dir.isDirectory()) {
return false;
}
final File[] files = dir.listFiles(fileNameFilter);
if (files == null) {
return false;
}
boolean hasDeletedAllFiles = true;
for (final File file : files) {
if (!deleteRecursively(file)) {
hasDeletedAllFiles = false;
}
}
return hasDeletedAllFiles;
}
public static String getNameByUrl(String url) {
String[] urlSplits = url.split("/");
return urlSplits.length == 0 ? null : urlSplits[urlSplits.length - 1];
}
/**
* @param path path
* @param startPos start pos
* @param totalSize end pos
* @return
*/
public static byte[] readFromFile(String path, int startPos, int totalSize) {
if (startPos < totalSize || startPos < 0 || totalSize < 0) {
return null;
}
byte[] buffers = null;
File file = new File(path);
if (!file.exists()) {
return buffers;
}
long len = file.length();
if (len - startPos < totalSize) {
totalSize = (int) len;
}
RandomAccessFile localRandomAccessFile = null;
try {
localRandomAccessFile = new RandomAccessFile(path, "r");
buffers = new byte[totalSize];
localRandomAccessFile.seek(startPos);
localRandomAccessFile.readFully(buffers);
return buffers;
} catch (Exception localException) {
localException.printStackTrace();
} finally {
if (localRandomAccessFile != null) {
try {
localRandomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
localRandomAccessFile = null;
}
}
}
return buffers;
}
/**
* 数据数据到Buffer
*
* @param bmp
* @param needRecycle true :Free the native object associated with this bitmap
* @return
*/
public static byte[] bmpToByteArray(final Bitmap bmp, final boolean needRecycle) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
bmp.compress(CompressFormat.PNG, 100, output);
if (needRecycle) {
bmp.recycle();
}
byte[] result = output.toByteArray();
try {
output.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static File[] listFilesIgnoreCase(File f, final String fileName) {
if (!f.isDirectory())
return null;
return f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return StringUtil.equalsIgnoreCase(name, fileName);
}
});
}
//经测试以下两种方法获取到的路径是一样的
// private static String mSdRootPath = Environment.getExternalStorageDirectory().getPath();
private static String mSdRootPath = Environment.getExternalStorageDirectory().getAbsolutePath();
private static String mDataRootPath = null;
private final static String FOLDER_NAME = "/study";
public FileUtils(Context context) {
mDataRootPath = context.getCacheDir().getPath();
}
public static String getStorageDirectory() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ?
mSdRootPath + FOLDER_NAME : mDataRootPath + FOLDER_NAME;
}
public static String getPackageLocalPath(Context context) {
File dir = context.getDir("study", Context.MODE_PRIVATE);
return dir.getAbsolutePath();
}
/**
* 保存到包名下 路径:/data/data/com.figo.study/app_mp3/hear.mp3
*
* @param context
* @param fileName
* @param bitmap
*/
public static void saveBitmapToData(Context context, String fileName, Bitmap bitmap) {
try {
File directory = new File(getPackageLocalPath(context));
if (directory.exists()) {
Log.d("fileUtils", "" + directory.isDirectory());
}
//data文件夹权限比较高,一般是无法直接创建文件到data/目录下的
// directory=new File(Environment.getDataDirectory(),"swiftime");
if (!directory.exists()) {
directory.mkdirs();//没有目录先创建目录
}
File file = new File(directory.getPath() + File.separator + fileName + ".png");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
if (e != null) {
e.printStackTrace();
}
}
}
/**
* 保存图片到本地 路径:/storage/emulated/0/mp3/hear.mp3
*
* @param fileName
* @param bitmap
* @throws IOException
*/
public static void saveBitmapToSdCard(Context context, String fileName, Bitmap bitmap) {
try {
if (bitmap == null) {
return;
}
String path = getStorageDirectory();
File folderFile = new File(path);
if (!folderFile.exists()) {
folderFile.mkdirs();
}
File file = new File(path + File.separator + fileName + ".png");
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (Exception e) {
//如果失败,就写入本地文件
saveBitmapToData(context, fileName, bitmap);
if (e != null) {
e.printStackTrace();
}
}
}
/**
* 从sdcard文件夹读取图片
*
* @param fileName
* @return
*/
public static Bitmap getBitmapFromSdCard(String fileName) {
return BitmapFactory.decodeFile(getStorageDirectory() + File.separator + fileName);
}
/**
* 从data文件夹读取图片
*
* @param fileName
* @return
*/
public static Bitmap getBitmapFromData(Context context, String fileName) {
return BitmapFactory.decodeFile(getPackageLocalPath(context) + File.separator + fileName);
}
/**
* 文件是否存在
*
* @param fileName
* @return
*/
public boolean isFileExists(String fileName) {
return new File(getStorageDirectory() + File.separator + fileName).exists();
}
/**
* 获取文件大小
*
* @param fileName
* @return
*/
public long getFileSize(String fileName) {
return new File(getStorageDirectory() + File.separator + fileName).length();
}
/**
* 删除文件
*/
public void deleteFile() {
File dirFile = new File(getStorageDirectory());
if (!dirFile.exists()) {
return;
}
if (dirFile.isDirectory()) {
String[] children = dirFile.list();
for (int i = 0; i < children.length; i++) {
new File(dirFile, children[i]).delete();
}
}
dirFile.delete();
}
}
第三步:文件操作FileActivity.java
package com.figo.study.activity;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import com.figo.study.R;
import com.figo.study.utils.FileUtils;
import com.figo.study.utils.ImageUtil;
public class FileActivity extends Activity {
Button mBtnWriteToSd, mBtnWriteToData, mBtnReadFromSd, mBtnReadFromData;
Bitmap mBitmap;
ImageView mImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
initView();
}
private void initView() {
mImg = (ImageView) findViewById(R.id.img_show);
mBtnWriteToSd = (Button) findViewById(R.id.btn_writeto_sd);
mBtnWriteToSd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher, opts);
opts.inSampleSize = ImageUtil.computeSampleSize(opts, -1, 480 * 480);
// 这里一定要将其设置回false,因为之前我们将其设置成了true
opts.inJustDecodeBounds = false;
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher, opts);
FileUtils.saveBitmapToSdCard(FileActivity.this, "test", mBitmap);
}
});
//一般我们建议把数据存放到data/data/packagename/dirname目录下面,因为即使有些手机没有sdcard,数据也可以存储下来,另外如果卸载应用
//数据也会跟着删除,写在sdcard的数据不会随着应用卸载而删除,对于特殊需求,需要保存历史数据的,建议保存到sdcard
mBtnWriteToData = (Button) findViewById(R.id.btn_writeto_data);
mBtnWriteToData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.mipmap.ab, opts);
opts.inSampleSize = ImageUtil.computeSampleSize(opts, -1, 480 * 480);
// 这里一定要将其设置回false,因为之前我们将其设置成了true
opts.inJustDecodeBounds = false;
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ab, opts);
FileUtils.saveBitmapToData(FileActivity.this, "test", mBitmap);
}
});
mBtnReadFromSd = (Button) findViewById(R.id.btn_read_from_sd);
mBtnReadFromSd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mImg.setImageBitmap(FileUtils.getBitmapFromSdCard("test.png"));
}
});
mBtnReadFromData = (Button) findViewById(R.id.btn_read_from_data);
mBtnReadFromData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mImg.setImageBitmap(FileUtils.getBitmapFromData(FileActivity.this, "test.png"));
}
});
}
}