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"));
            }
        });

    }
}