Android – 将资产复制到内部存储

美好的一天!

我刚刚开始为Android开发。 在我的应用程序,我需要将我的资产文件夹中的项目复制到内部存储。

我在SO上搜索了很多东西,包括把它复制到外部存储器。 如何将文件从’资产’文件夹复制到SD卡?

这是我想要实现的:我有一个目录已经在X> Y> Z的内部存储。 我需要一个文件复制到Y和另一个到Z.

任何人都可以帮我一个代码片段? 我真的不知道如何继续下去。

对不起,我的英语不好。

非常感谢。

使用

String out= Environment.getExternalStorageDirectory().getAbsolutePath() + "/X/Y/Z/" ; File outFile = new File(out, Filename); 

在你的编辑后编辑。 链接答案。

  private void copyAssets() { AssetManager assetManager = getAssets(); String[] files = null; try { files = assetManager.list(""); } catch (IOException e) { Log.e("tag", "Failed to get asset file list.", e); } for(String filename : files) { InputStream in = null; OutputStream out = null; try { in = assetManager.open(filename); String outDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/X/Y/Z/" ; File outFile = new File(outDir, filename); out = new FileOutputStream(outFile); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch(IOException e) { Log.e("tag", "Failed to copy asset file: " + filename, e); } } } private void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while((read = in.read(buffer)) != -1){ out.write(buffer, 0, read); } } 

嗨,伙计们,我做了这样的事情。 其中允许您复制所有的目录结构从Android AssetManager复制:)

 public String copyDirorfileFromAssetManager(String arg_assetDir, String arg_destinationDir) throws IOException { File sd_path = Environment.getExternalStorageDirectory(); String dest_dir_path = sd_path + addLeadingSlash(arg_destinationDir); File dest_dir = new File(dest_dir_path); createDir(dest_dir); AssetManager asset_manager = getApplicationContext().getAssets(); String[] files = asset_manager.list(arg_assetDir); for (int i = 0; i < files.length; i++) { String abs_asset_file_path = addTrailingSlash(arg_assetDir) + files[i]; String sub_files[] = asset_manager.list(abs_asset_file_path); if (sub_files.length == 0) { // It is a file String dest_file_path = addTrailingSlash(dest_dir_path) + files[i]; copyAssetFile(abs_asset_file_path, dest_file_path); } else { // It is a sub directory copyDirorfileFromAssetManager(abs_asset_file_path, addTrailingSlash(arg_destinationDir) + files[i]); } } return dest_dir_path; } public void copyAssetFile(String assetFilePath, String destinationFilePath) throws IOException { InputStream in = getApplicationContext().getAssets().open(assetFilePath); OutputStream out = new FileOutputStream(destinationFilePath); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) out.write(buf, 0, len); in.close(); out.close(); } public String addTrailingSlash(String path) { if (path.charAt(path.length() - 1) != '/') { path += "/"; } return path; } public String addLeadingSlash(String path) { if (path.charAt(0) != '/') { path = "/" + path; } return path; } public void createDir(File dir) throws IOException { if (dir.exists()) { if (!dir.isDirectory()) { throw new IOException("Can't create directory, a file is in the way"); } } else { dir.mkdirs(); if (!dir.isDirectory()) { throw new IOException("Unable to create directory"); } } } 

尝试下面的代码

 private void copyAssets() { AssetManager assetManager = getAssets(); String[] files = null; try { files = assetManager.list(""); } catch (IOException e) { Log.e("tag", "Failed to get asset file list.", e); } for(String filename : files) { InputStream in = null; OutputStream out = null; try { in = assetManager.open(filename); File outFile = new File(getExternalFilesDir(null), filename); out = new FileOutputStream(outFile); copyFile(in, out); in.close(); in = null; out.flush(); out.close(); out = null; } catch(IOException e) { Log.e("tag", "Failed to copy asset file: " + filename, e); } } } private void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; int read; while((read = in.read(buffer)) != -1){ out.write(buffer, 0, read); } } 
 public void addFilesToSystem(String sysName, String intFil, Context c){ //sysName is the name of the file we have in the android os //intFil is the name of the internal file file = new File(path, sysName + ".txt"); if(!file.exists()){ path.mkdirs(); try { AssetManager am = c.getAssets(); InputStream is = am.open(intFil); OutputStream os = new FileOutputStream(file); byte[] data = new byte[is.available()]; is.read(data); os.write(data); is.close(); os.close(); Toast t = Toast.makeText(c, "Making file: " + file.getName() + ". One time action", Toast.LENGTH_LONG); t.show(); //Update files for the user to use MediaScannerConnection.scanFile(c, new String[] {file.toString()}, null, new MediaScannerConnection.OnScanCompletedListener() { public void onScanCompleted(String path, Uri uri) { // TODO Auto-generated method stub } }); } catch (IOException e) { Toast t = Toast.makeText(c, "Error: " + e.toString() + ". One time action", Toast.LENGTH_LONG); t.show(); e.printStackTrace(); } } } 

要添加文件,请调用addFilesToSystem(“this_file_is_in_the_public_system”,“this_file_is_in_the_assets_folder”,context / this context is if you have the method in the Activity /

希望能帮助到你

你可以使用Envrionment#getDataDirectory方法。 它会给出内部存储器的数据目录的路径。 这通常是所有的应用程序相关的数据存储的地方。

或者,如果要存储在根目录中,则可以使用Environment#getRootDirectory方法。

我在Kotlin上的一个小解决方案,用于将数据从资产复制到INTERNAL STORAGE

 fun copy() { val bufferSize = 1024 val assetManager = context.assets val assetFiles = assetManager.list("") assetFiles.forEach { val inputStream = assetManager.open(it) val outputStream = FileOutputStream(File(context.filesDir, it)) try { inputStream.copyTo(outputStream, bufferSize) } finally { inputStream.close() outputStream.flush() outputStream.close() } } }