Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将资产文件夹子目录复制到外部存储器中的特定文件夹_Java_Android_Android Assets - Fatal编程技术网

Java 将资产文件夹子目录复制到外部存储器中的特定文件夹

Java 将资产文件夹子目录复制到外部存储器中的特定文件夹,java,android,android-assets,Java,Android,Android Assets,我正在使用Android上的ProgramAB,它要求我通过在其中创建/bots/目录,将aiml文件从assets文件夹复制到外部存储器。这是我从教android中聊天机器人的教程中获取的代码(代码中调用的其他函数与目录复制无关) 我尝试过其他的解决办法,但都不管用 //checking SD card availablility boolean a = isSDCARDAvailable(); //receiving the assets from th

我正在使用Android上的ProgramAB,它要求我通过在其中创建/bots/目录,将aiml文件从assets文件夹复制到外部存储器。这是我从教android中聊天机器人的教程中获取的代码(代码中调用的其他函数与目录复制无关)

我尝试过其他的解决办法,但都不管用

   //checking SD card availablility
        boolean a = isSDCARDAvailable();
        //receiving the assets from the app directory
        AssetManager assets = getResources().getAssets();
        File jayDir = new File(Environment.getExternalStorageDirectory().toString() + "/hari/bots/Hari");
        boolean b = jayDir.mkdirs();
        if (jayDir.exists()) {
            //Reading the file
            try {
                for (String dir : assets.list("Hari")) {
                    File subdir = new File(jayDir.getPath() + "/" + dir);
                    boolean subdir_check = subdir.mkdirs();
                    for (String file : assets.list("Hari/" + dir)) {
                        File f = new File(jayDir.getPath() + "/" + dir + "/" + file);
                        if (f.exists()) {
                            continue;
                        }
                        InputStream in = null;
                        OutputStream out = null;
                        in = assets.open("Hari/" + dir + "/" + file);
                        out = new FileOutputStream(jayDir.getPath() + "/" + dir + "/" + file);
                        //copy file from assets to the mobile's SD card or any secondary memory
                        copyFile(in, out);
                        in.close();
                        in = null;
                        out.flush();
                        out.close();
                        out = null;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //get the working directory
        MagicStrings.root_path = Environment.getExternalStorageDirectory().toString() + "/hari";
        System.out.println("Working Directory = " + MagicStrings.root_path);
        AIMLProcessor.extension =  new PCAIMLProcessorExtension();
        //Assign the AIML files to bot for processing  
        bot = new Bot("Hari", MagicStrings.root_path, "chat");
        chat = new Chat(bot);
        String[] args = null;
        mainFunction(args);

这段代码运行得非常好。 这是全部


boolean b=jayDir.mkdirs()。仅当目录尚不存在时,才应调用mkdirs。如果mkdirs返回false,您应该向告诉您的用户敬酒。然后返回。现在你盲目地继续。请修改你的代码。@greenapps我对android真的很陌生,我甚至无法检查复制是否真的发生了。代码不执行任务是因为您声明的问题吗?您应该告诉我们什么可行,什么不可行。使用log语句和toast来查看发生了什么。做一些基本的调试。实际上我正在使用VisualStudioEmulator,所以调试变得更像是一种开销,因为adb链接问题等等。将定制代码以尽快供公众参考。:)这是完美的工作!实际上,我也关注过同一个博客:)
/**
 * Copy the asset at the specified path to this app's data directory. If the
 * asset is a directory, its contents are also copied.
 * 
 * @param path
 * Path to asset, relative to app's assets directory.
 */
private void copyAsset(String path) {
  AssetManager manager = getAssets();

  // If we have a directory, we make it and recurse. If a file, we copy its
  // contents.
  try {
    String[] contents = manager.list(path);

    // The documentation suggests that list throws an IOException, but doesn't
    // say under what conditions. It'd be nice if it did so when the path was
    // to a file. That doesn't appear to be the case. If the returned array is
    // null or has 0 length, we assume the path is to a file. This means empty
    // directories will get turned into files.
    if (contents == null || contents.length == 0)
      throw new IOException();

    // Make the directory.
    File dir = new File(getExternalFilesDir(null), path);
    dir.mkdirs();

    // Recurse on the contents.
    for (String entry : contents) {
      copyAsset(path + "/" + entry);
    }
  } catch (IOException e) {
    copyFileAsset(path);
  }
}

/**
 * Copy the asset file specified by path to app's data directory. Assumes
 * parent directories have already been created.
 * 
 * @param path
 * Path to asset, relative to app's assets directory.
 */
private void copyFileAsset(String path) {
  File file = new File(getExternalFilesDir(null), path);
  try {
    InputStream in = getAssets().open(path);
    OutputStream out = new FileOutputStream(file);
    byte[] buffer = new byte[1024];
    int read = in.read(buffer);
    while (read != -1) {
      out.write(buffer, 0, read);
      read = in.read(buffer);
    }
    out.close();
    in.close();
  } catch (IOException e) {
    Log.e(e);
  }
}