当前位置: 首页 > 知识库问答 >
问题:

在intent.action_open_document_tree返回的目录中创建新文件

毋承基
2023-03-14

在我的应用程序中,用户可以选择一个目录,在其中使用隐含的意图action_open_document_tree创建Excel文件。但是,OnActivityResult()中返回的Uri不能由FileOutputStream()使用。它抛出FileNotFoundException:

java.io.FileNotFoundException: content:/com.android.externalstorage.documents/tree/home%3A:test.xlsx (No such file or directory)

OnActivityResult()中,我通过file.exists()检查路径是否存在,如果不存在,我要创建一个新的Excel文件。

onActivityResult():

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        Log.d(TAG, "onActivityResult: called");
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK && requestCode == 2) {
            Log.d(TAG, "onActivityResult: path = " + data.getData()
                                                         .getPath());
            Uri treePath = data.getData();
            File path = new File(treePath + File.pathSeparator + "test.xlsx");
            if (path.exists()) {
                updateExistingExcelFile(path);
            } else {
                createNewExcelFile(path);
            }
        }
    }

createNewExcelFile():

    private void createNewExcelFile(File path) {
        Log.d(TAG, "createNewExcelFile: called");
        Workbook workbook = new HSSFWorkbook();
        Cell cell;
        Sheet sheet;
        sheet = workbook.createSheet("Name of sheet");
        Row row = sheet.createRow(0);
        cell = row.createCell(0);
        cell.setCellValue("Name");
        cell = row.createCell(1);
        cell.setCellValue("Number");
        sheet.setColumnWidth(0, (10 * 200));
        sheet.setColumnWidth(1, (10 * 200));
        FileOutputStream fileOutputStream;
        try {
            fileOutputStream = new FileOutputStream(path);
            workbook.write(fileOutputStream);
            Toast.makeText(this, "Created", Toast.LENGTH_LONG)
                 .show();
            fileOutputStream.close();
        } catch (IOException e) {
            Log.e(TAG, "createNewExcelFile: ", e);
        }
    }

共有1个答案

游高杰
2023-03-14

步骤1:获取从action_open_document_tree获得的URI并将其传递给documentfile.fromtreeURI()

步骤2:对DocumentFile调用CreateFile()以获得表示子文档DocumentFile

步骤3:对在步骤2中创建的DocumentFile调用getURI()

步骤4:调用ContentResolver上的OpenOutputStream(),传入步骤3中的URI,以获得可用于编写内容的OutputStream。通过对某些上下文(如活动)调用GetContentResolver(),可以获得ContentResolver

有关使用action_open_document_tree的更多信息,请参阅此博文。

 类似资料:
  • 我有这个方法来获取Java程序运行的目录。 但是,当我创建一个新的实例并将此目录作为其父目录时,它会在驱动器的根目录中返回一个。 我期望这个文件的绝对路径是,但它的。

  • 我正在尝试创建一个脚本,以便在动态创建一个新文件夹中执行假脱机操作这是我的代码 并且它给出了无法创建假脱机文件C:\Users\rjen01\Desktop\MAR\21MAR2017\U 1227的错误。csv 这是因为没有文件夹C:\Users\rjen01\Desktop\MAR。所以如何在spool命令中动态创建新文件夹。

  • 问题内容: 我想编写一个检查目录是否存在的程序;如果该目录不存在,那么它将在其中创建目录和一个日志文件,但是如果该目录已经存在,则它将在该文件夹中创建一个新的日志文件。 我如何在Linux中用C做到这一点? 问题答案: 看看检查,如果该目录存在, 和,创建目录。 您可以使用和命令查看这些功能的手册。

  • 问题内容: 我试图在该目录中创建一个新目录和一个文件。谁能告诉我我要去哪里错了? 我正在使用Windows系统,并且我希望该目录存在于我的文件所在的文件夹中。 问题答案: 基本上,正在发生的事情是,您正在创建一个名为的目录,然后尝试创建一个名为同一个东西的新文件,这显然行不通。 所以,而不是… 尝试… 额外 如果失败,实际上不会抛出任何异常,这很烦人,所以我会做更多类似的事情… 就这样我知道实际的

  • 条件是,如果目录存在,则必须在该特定目录中创建文件,而不创建新目录。 下面的代码仅使用新目录创建一个文件,而不针对现有目录。例如,目录名类似于“GETDIRECTION”:

  • 问题内容: 如果要在中创建文件,可以执行以下操作: 另外,我想用于创建文件。那我该怎么办呢?由于某种原因,该文件未在正确的目录中创建。 问题答案: 最好的方法是: