1. 程式人生 > >android獲取assets內容複製到本地儲存

android獲取assets內容複製到本地儲存

新建的專案,一定要記得新增讀寫檔案的許可權啊,不然沒有效果的,你不加許可權,沒有效果請不要找我

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

(1)我們首先需要建立assets資料夾,如圖所示,在project狀態下,滑鼠選中main資料夾,右鍵單擊,然後依次選擇我們的內容,最後點選確定,assets就建立好了

然後我們在assets資料夾下面新建一個資料夾叫folder,把我們需要複製的檔案放到此資料夾下面,我們放了三個不同的檔案,如圖所示:

(2)複製assets檔案到內部儲存中

package com.android.example.assets;

import android.content.Context;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Utils{

    public static void doCopy(Context context, String assetsPath, String desPath) throws IOException {
        String[] srcFiles = context.getAssets().list(assetsPath);//for directory
        for (String srcFileName : srcFiles) {
            String outFileName = desPath + File.separator + srcFileName;
            String inFileName = assetsPath + File.separator + srcFileName;
            if (assetsPath.equals("")) {// for first time
                inFileName = srcFileName;
            }
            Log.e("tag","========= assets: "+ assetsPath+"  filename: "+srcFileName +" infile: "+inFileName+" outFile: "+outFileName);
            try {
                InputStream inputStream = context.getAssets().open(inFileName);
                copyAndClose(inputStream, new FileOutputStream(outFileName));
            } catch (IOException e) {//if directory fails exception
                e.printStackTrace();
                new File(outFileName).mkdir();
                doCopy(context,inFileName, outFileName);
            }

        }
    }

    private static void closeQuietly(OutputStream out){
        try{
            if(out != null) out.close();;
        }catch (IOException ex){
            ex.printStackTrace();
        }
    }

    private static void closeQuietly(InputStream is){
        try{
            if(is != null){
                is.close();
            }
        }catch (IOException ex){
            ex.printStackTrace();
        }
    }

    private static void copyAndClose(InputStream is, OutputStream out) throws IOException{
        copy(is,out);
        closeQuietly(is);
        closeQuietly(out);
    }

    private static void copy(InputStream is, OutputStream out) throws IOException{
        byte[] buffer = new byte[1024];
        int n = 0;
        while(-1 != (n = is.read(buffer))){
            out.write(buffer,0,n);
        }
    }
}

這個時候,請你們開啟手機的內部儲存,檔案在Android/data/專案包名/files/  裡面就是啦,反正我的手機是有的,你們試一下,按照我的步驟來,肯定也是有的,到這裡我們的複製就成功了

(3)計算檔案大小的類

package com.example.administrator.testz;


        import android.util.Log;

        import java.io.File;
        import java.io.FileInputStream;
        import java.text.DecimalFormat;

/**
 * @CreateBy HaiyuKing
 * @Used android 獲取資料夾或檔案的大小 以B、KB、MB、GB 為單位
 * @參考資料 http://blog.csdn.net/jiaruihua_blog/article/details/13622939
 */
public class FileSizeUtil {

    public static final int SIZETYPE_B = 1;//獲取檔案大小單位為B的double值
    public static final int SIZETYPE_KB = 2;//獲取檔案大小單位為KB的double值
    public static final int SIZETYPE_MB = 3;//獲取檔案大小單位為MB的double值
    public static final int SIZETYPE_GB = 4;//獲取檔案大小單位為GB的double值
    /**
     * 獲取指定檔案或指定資料夾的的指定單位的大小
     * @param filePath 檔案路徑
     * @param sizeType 獲取大小的型別1為B、2為KB、3為MB、4為GB
     * @return double值的大小
     */
    public static double getFolderOrFileSize(String filePath,int sizeType){
        File file=new File(filePath);
        long blockSize=0;
        try {
            if(file.isDirectory()){
                blockSize = getFolderSize(file);
            }else{
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("獲取檔案大小","獲取失敗!");
        }
        return FormetFileSize(blockSize, sizeType);
    }

    public static double getsizeFolderOrFileSize(File file,int sizeType){
        long blockSize=0;
        try {
            if(file.isDirectory()){
                blockSize = getFolderSize(file);
            }else{
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("獲取檔案大小","獲取失敗!");
        }
        return FormetFileSize(blockSize, sizeType);
    }

    /**
     * 呼叫此方法自動計算指定檔案或指定資料夾的大小
     * @param filePath 檔案路徑
     * @return 計算好的帶B、KB、MB、GB的字串
     */
    public static String getAutoFolderOrFileSize(String filePath){
        File file=new File(filePath);
        long blockSize=0;
        try {
            if(file.isDirectory()){
                blockSize = getFolderSize(file);
            }else{
                blockSize = getFileSize(file);
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("獲取檔案大小","獲取失敗!");
        }
        return FormetFileSize(blockSize);
    }
    /**
     * 獲取指定檔案的大小
     * @param file
     * @return
     * @throws Exception
     */
    private static long getFileSize(File file) throws Exception
    {
        long size = 0;
        if (file.exists()){
            FileInputStream fis = null;
            fis = new FileInputStream(file);
            size = fis.available();
            fis.close();
        }
        else{
            file.createNewFile();
            Log.e("獲取檔案大小","檔案不存在!");
        }

        return size;
    }

    /**
     * 獲取指定資料夾的大小
     * @param file
     * @return
     * @throws Exception
     */
    private static long getFolderSize(File file) throws Exception
    {
        long size = 0;
        File flist[] = file.listFiles();
        for (int i = 0; i < flist.length; i++){
            if (flist[i].isDirectory()){
                size = size + getFolderSize(flist[i]);
            }
            else{
                size =size + getFileSize(flist[i]);
            }
        }
        return size;
    }
    /**
     * 轉換檔案大小
     * @param fileSize
     * @return
     */
    private static String FormetFileSize(long fileSize)
    {
        DecimalFormat df = new DecimalFormat("#.00");
        String fileSizeString = "";
        String wrongSize="0B";
        if(fileSize==0){
            return wrongSize;
        }
        if (fileSize < 1024){
            fileSizeString = df.format((double) fileSize) + "B";
        }
        else if (fileSize < 1048576){
            fileSizeString = df.format((double) fileSize / 1024) + "KB";
        }
        else if (fileSize < 1073741824){
            fileSizeString = df.format((double) fileSize / 1048576) + "MB";
        }
        else{
            fileSizeString = df.format((double) fileSize / 1073741824) + "GB";
        }
        return fileSizeString;
    }
    /**
     * 轉換檔案大小,指定轉換的型別
     * @param fileSize
     * @param sizeType
     * @return
     */
    private static double FormetFileSize(long fileSize,int sizeType)
    {
        DecimalFormat df = new DecimalFormat("#.00");
        double fileSizeLong = 0;
        switch (sizeType) {
            case SIZETYPE_B:
                fileSizeLong=Double.valueOf(df.format((double) fileSize));
                break;
            case SIZETYPE_KB:
                fileSizeLong=Double.valueOf(df.format((double) fileSize / 1024));
                break;
            case SIZETYPE_MB:
                fileSizeLong=Double.valueOf(df.format((double) fileSize / 1048576));
                break;
            case SIZETYPE_GB:
                fileSizeLong=Double.valueOf(df.format((double) fileSize / 1073741824));
                break;
            default:
                break;
        }
        return fileSizeLong;
    }
}

(4)在主檔案中呼叫,那個路徑寫死了 是我的手機的路徑  你們可能需要改一下才可以使用,寫完以後執行吧,有一個重要的log日誌,是關於列印檔案路徑的,這個路徑就是複製到手機記憶體的路徑啦

package com.example.administrator.testz;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.File;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {
    private Button btn_txt,button;
    private EditText et;
    private TextView txt;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_txt = (Button)findViewById(R.id.btn_txt);
        button= (Button)findViewById(R.id.button);
        et = (EditText)findViewById(R.id.et);
        txt = (TextView) findViewById(R.id.txt);
        /*
         /storage/emulated/0/Android/data/com.example.administrator.testz/files/aspcone.jsah
        /storage/emulated/0/Android/data/com.example.administrator.testz/files/like.png
        /storage/emulated/0/Android/data/com.example.administrator.testz/files/test.txt
        */
        et.setText("/storage/emulated/0/Android/data/com.example.administrator.testz/files/aspcone.jsah");

        btn_txt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    doCopy();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
               String pathname = et.getText().toString();
                double fileSizeKB = FileSizeUtil.getFolderOrFileSize(pathname,FileSizeUtil.SIZETYPE_KB);
                String fileSize = FileSizeUtil.getAutoFolderOrFileSize(pathname);
                txt.setText("fileSizeKB=" + fileSizeKB + "\n" +
                        "fileSize=" + fileSize);
            }
        });

    }

    private void doCopy() throws IOException{
        File externalDir = this.getExternalFilesDir(null);
        Utils.doCopy(this,"folder",externalDir.getPath());
    }
}

最後貼上我們的執行效果:

大致就是這麼個效果啦,如果需要原始碼的同學,請關注我,進入我的csdn資源,我已經把原始碼上傳到csdn了