android开发步步为营之87:从sdcard或者data文件夹下读写数据
来源:互联网 发布:怎么备案域名 编辑:程序博客网 时间:2024/04/28 23:29
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")); } }); }}
1 0
- android开发步步为营之87:从sdcard或者data文件夹下读写数据
- Android开发之sdcard读写数据(源代码分享)
- android sdcard下创建文件夹
- android开发步步为营之86:关于对阿拉伯语页面文字从右往左的支持
- android 读写文件(包括从sdcard中)
- android读写文件的实现(针对android4.4不能在sdcard根目录下创建文件夹)
- android开发步步为营之102:通过xml设置或者代码动态设置windowSoftInputMode
- Android中SdCard的数据读写
- 往Android SDCard中读写入数据
- android开发步步为营之54:读取assets,raw文件夹下文件
- android开发步步为营之91:自定义AlertDialog
- 【Android】数据存储之SDcard
- Android之sdcard保存数据
- android开发步步为营之9:反编译apk
- android开发步步为营之14:App Widgets
- android开发步步为营之20:网络设置
- android开发步步为营之28:自定义Menu
- android开发步步为营之11:从手机联系人列表获取联系电话
- poj 1860-Currency Exchange(Bellman_Ford算法)
- [笔记] 大型网站技术架构——核心原理与案例分析 [一]
- 斐波那契数列
- android学习笔记——ImageSwitcher控件(图片切换器)
- 关于”点九”
- android开发步步为营之87:从sdcard或者data文件夹下读写数据
- Round #6 (Div. 2 Only) (E )(RMQ+尺取法)
- oracle删除表了如何恢复数据以及如何把一张表的数据复制到另一张表
- xcode 清理空间
- android学习笔记——Fragment(碎片)
- 二进制中1的个数
- 特征选择常用算法综述
- 数据库
- pl/sql游标