【问题标题】:Overwriting an existing file in external storage using its URI [android]?使用 URI [android] 覆盖外部存储中的现有文件?
【发布时间】:2020-04-29 00:41:56
【问题描述】:

我有一个应用程序,它使用 .csv 文件的 URI 和扫描仪导入数据。它的工作原理是这样的:

private List<String[]> loadCSVfromURI(Uri file) throws FileNotFoundException, IOException {

    Scanner csvFileScanner = new Scanner(new BufferedReader(new InputStreamReader(getContentResolver().openInputStream(file))));

    List<String[]> csvROW = new ArrayList<>();
    int tempRow = 0;
    while(csvFileScanner.hasNextLine()){
        String line = csvFileScanner.nextLine(); // Get single line from reader
        String[] splitLine = line.split(",");
        csvROW.add(tempRow, splitLine);
        tempRow++;
    }
    return csvROW;
}

我的应用程序现在已编辑导入的数据(存储在字符串数组列表中)并将其返回为单个字符串。数据已返回为 .CSV 样式格式,如下所示。

private String formatForCSV() {
    final String delimeter = "\n";
    StringBuilder formatCSVdata = new StringBuilder();
    String saveCSVrow;
    for(String[] thisRow: curCSV){
        saveCSVrow = String.join(",",thisRow);
        saveCSVrow = saveCSVrow + delimeter;
        formatCSVdata.append(saveCSVrow);
    }

    String saveCSV = formatCSVdata.toString();

    return saveCSV;
}

我现在希望将字符串保存回原始文件,覆盖最初存储在那里的内容,但保持相同的位置和文件名。如何使用文件数据首次复制到我的应用程序时的 URI 执行保存/覆盖功能?

【问题讨论】:

    标签: android csv uri export-to-csv


    【解决方案1】:

    所以我使用 Content Resolver 和 openOutputStream 解决了这个问题。

    OutputStream overWritter = null; //Outputstream to overwrite original content
        ContentResolver saveResolver = this.getContentResolver();
        try {
            overWritter = saveResolver.openOutputStream(originalURI);
            if (overWritter != null) {
                overWritter.write(myString.getBytes());
                overWritter.close();
                Toast.makeText(this, "Save Successful", Toast.LENGTH_LONG).show();
    
            }
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(this, "Save Failure", Toast.LENGTH_LONG).show();
    
        }
    

    这会保存并覆盖原始 URI 中的文件。我愿意接受更好的解决方案。也许更强大的东西。

    【讨论】:

    • 这在 API 29 中不再有效。例如如果第二次myString为空,则文件不保存。
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 2015-09-24
    • 2016-10-23
    • 2018-04-22
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多