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