android獲取assets內容複製到本地儲存
阿新 • • 發佈:2018-12-14
新建的專案,一定要記得新增讀寫檔案的許可權啊,不然沒有效果的,你不加許可權,沒有效果請不要找我
<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了