从资产复制多个文件到内部存储 [英] Copy multiple files from asset to internal storage

查看:86
本文介绍了从资产复制多个文件到内部存储的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是原来的code从资产拷贝一个文件到内部存储我在网上找到:

 上下文语境= getApplicationContext();
串DestinationFile = Context.getFilesDir()的getPath()+文件分割符+DB.sqlite。;
如果(!新文件(DestinationFile).exists()){
  尝试{
    CopyFromAssetsToStorage(上下文,数据库/ DB.sqlite,DestinationFile);
  }赶上(IOException异常五){
    // TODO自动生成catch块
    e.printStackTrace();
  }
}私人无效CopyFromAssetsToStorage(上下文的背景下,字符串的SourceFile,字符串DestinationFile)抛出IOException
  InputStream为= Context.getAssets()打开(的SourceFile)。
  OutputStream的OS =新的FileOutputStream(DestinationFile);
  CopyStream(IS,OS);
  OS.flush();
  OS.close();
  IS.close();
}
私人无效CopyStream(输入的InputStream,OutputStream的输出)抛出IOException
  字节[]缓冲区=新的字节[5120];
  INT长度= Input.read(缓冲);
  而(长度大于0){
    Output.write(缓冲液,0,长度);
    长度= Input.read(缓冲液);
  }
}

以上code是复制一个文件工作的罚款。不过,我要的是将多个文件拷贝,而不是一个文件。继MT8,我修改了code以下:

 公共类MainActivity延伸活动{    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);            ArrayList的<串GT; destFiles =新的ArrayList<串GT;();
            destFiles.add(FileB.jpg);
            destFiles.add(FileC.jpg);
            destFiles.add(FileD.jpg);            的for(int i = 0; I< destFiles.size();我++){
            上下文的背景下= getApplicationContext();
            串DestinationFile = Context.getFilesDir()的getPath()+文件分割符+FileA.db。;
            如果(!新文件(DestinationFile).exists()){
              尝试{
                CopyFromAssetsToStorage(上下文,数据库/ FileA.db,destFiles.get(ⅰ));
              }赶上(IOException异常五){
                // TODO自动生成catch块
                e.printStackTrace();
              }
            }
            }
    }            私人无效CopyFromAssetsToStorage(上下文的背景下,字符串的SourceFile,字符串DestinationFile)抛出IOException
              InputStream为= Context.getAssets()打开(的SourceFile)。
              OutputStream的OS =新的FileOutputStream(DestinationFile);
              CopyStream(IS,OS);
              OS.flush();
              OS.close();
              IS.close();
            }
            私人无效CopyStream(输入的InputStream,OutputStream的输出)抛出IOException
              字节[]缓冲区=新的字节[5120];
              INT长度= Input.read(缓冲);
              而(长度大于0){
                Output.write(缓冲液,0,长度);
                长度= Input.read(缓冲液);
              }
            }
}

不过,文件不会被复制。我确实错任何部分?


解决方案

 第1步:u需要把所有文件名的ArrayList首先要说的ArrayList<串GT; destFiles。
ArrayList的<串GT; destFiles =新的ArrayList<串GT;();
destFiles.add(FILEA);
destFiles.add(FILEB);
destFiles.add(FileC);第2步:For循环:的for(int i = 0; I< destFiles.size;我++)
{
上下文的背景下= getApplicationContext();
串DestinationFile = Context.getFilesDir()的getPath()+文件分割符+DB.sqlite。;
如果(!新文件(DestinationFile).exists()){
  尝试{
    CopyFromAssetsToStorage(上下文,数据库/ DB.sqlite,destFiles.get(ⅰ));
  }赶上(IOException异常五){
    // TODO自动生成catch块
    e.printStackTrace();
  }
}私人无效CopyFromAssetsToStorage(上下文的背景下,字符串的SourceFile,字符串DestinationFile)抛出IOException
  InputStream为= Context.getAssets()打开(的SourceFile)。
  OutputStream的OS =新的FileOutputStream(DestinationFile);
  CopyStream(IS,OS);
  OS.flush();
  OS.close();
  IS.close();
}
私人无效CopyStream(输入的InputStream,OutputStream的输出)抛出IOException
  字节[]缓冲区=新的字节[5120];
  INT长度= Input.read(缓冲);
  而(长度大于0){
    Output.write(缓冲液,0,长度);
    长度= Input.read(缓冲液);
  }
}
}

This is the original code for copying one file from asset to internal storage I found online:

Context Context = getApplicationContext();
String DestinationFile = Context.getFilesDir().getPath() + File.separator + "DB.sqlite";
if (!new File(DestinationFile).exists()) {
  try {
    CopyFromAssetsToStorage(Context, "Database/DB.sqlite", DestinationFile);
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}

private void CopyFromAssetsToStorage(Context Context, String SourceFile, String DestinationFile) throws IOException {
  InputStream IS = Context.getAssets().open(SourceFile);
  OutputStream OS = new FileOutputStream(DestinationFile);
  CopyStream(IS, OS);
  OS.flush();
  OS.close();
  IS.close();
}
private void CopyStream(InputStream Input, OutputStream Output) throws IOException {
  byte[] buffer = new byte[5120];
  int length = Input.read(buffer);
  while (length > 0) {
    Output.write(buffer, 0, length);
    length = Input.read(buffer);
  }
}

The above code is working fine for copying one file. However, what I want is to copy multiple files instead of one file. Following MT8, I modified my the code to below:

public class MainActivity extends Activity{

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

            ArrayList<String> destFiles = new ArrayList<String>();
            destFiles.add("FileB.jpg");
            destFiles.add("FileC.jpg");
            destFiles.add("FileD.jpg");

            for(int i =0 ; i < destFiles.size(); i++) {
            Context Context = getApplicationContext();
            String DestinationFile = Context.getFilesDir().getPath() + File.separator + "FileA.db";
            if (!new File(DestinationFile).exists()) {
              try {
                CopyFromAssetsToStorage(Context, "database/FileA.db", destFiles.get(i));
              } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
              }
            }
            }
    }

            private void CopyFromAssetsToStorage(Context Context, String SourceFile, String DestinationFile) throws IOException {
              InputStream IS = Context.getAssets().open(SourceFile);
              OutputStream OS = new FileOutputStream(DestinationFile);
              CopyStream(IS, OS);
              OS.flush();
              OS.close();
              IS.close();
            }
            private void CopyStream(InputStream Input, OutputStream Output) throws IOException {
              byte[] buffer = new byte[5120];
              int length = Input.read(buffer);
              while (length > 0) {
                Output.write(buffer, 0, length);
                length = Input.read(buffer);
              }
            }
}

However, the files won't be copied. Any part that I did wrongly?

解决方案

Step 1 : u need to put the All files name in Arraylist first say ArrayList<String> destFiles .
ArrayList<String> destFiles = new ArrayList<String>(); 
destFiles.add("FileA");
destFiles.add("FileB"); 
destFiles.add("FileC");

Step 2 : For loop :

for(int i=0;i<destFiles.size;i++)
{
Context Context = getApplicationContext();
String DestinationFile = Context.getFilesDir().getPath() + File.separator + "DB.sqlite";
if (!new File(DestinationFile).exists()) {
  try {
    CopyFromAssetsToStorage(Context, "Database/DB.sqlite", destFiles.get(i));
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}

private void CopyFromAssetsToStorage(Context Context, String SourceFile, String DestinationFile) throws IOException {
  InputStream IS = Context.getAssets().open(SourceFile);
  OutputStream OS = new FileOutputStream(DestinationFile);
  CopyStream(IS, OS);
  OS.flush();
  OS.close();
  IS.close();
}
private void CopyStream(InputStream Input, OutputStream Output) throws IOException {
  byte[] buffer = new byte[5120];
  int length = Input.read(buffer);
  while (length > 0) {
    Output.write(buffer, 0, length);
    length = Input.read(buffer);
  }
}
}

这篇关于从资产复制多个文件到内部存储的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆